在Java中编写地图文字样式是否有最佳实践?

FK8*_*K82 27 java class object map literals

简而言之,如果你想在Java中编写一个例如常量的映射,例如Python和Javascript,你会把它写成文字,

T<String,String> CONSTANTS =
{
    "CONSTANT_NAME_0": CONSTANT_VALUE_0 ,
    "CONSTANT_NAME_1": CONSTANT_VALUE_1 ,
    "CONSTANT_NAME_2": CONSTANT_VALUE_2 ,
    //...
} ;
Run Code Online (Sandbox Code Playgroud)

是否有一个Class或任何预设Object可用于编写这样的数据结构?

xpm*_*teo 51

我喜欢这样做:

Map map = new HashMap() {{
    put("foo", "bar");
    put(123, 456);
}};
Run Code Online (Sandbox Code Playgroud)

double {{}}是一个实例初始化块.它们有点不寻常,但它们很有用.不需要图书馆或帮助者.

  • 请注意,双括号包含用于*HashMap*的子类的实例初始值设定项.我个人不喜欢为这样的用途创建一个子类. (5认同)
  • 我最喜欢这个,因为它不需要外部库或新类,它是最短的. (3认同)
  • @cfstras这是胡说八道.如果它们["代表相同的映射"],则Map的比较相等(https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#equals \(java.lang.宾语\)). (2认同)

Jor*_*orn 35

不,Java没有地图文字.您最接近的是使用Google Collections的ImmutableMap:

Map<K,V> CONSTANTS = ImmutableMap.of(
    NAME_1, VALUE_1,
    NAME_2, VALUE_2
    //etc.
  );
Run Code Online (Sandbox Code Playgroud)

  • @Stijn无论如何,我总是认为Guava应该在你的类路径上.至于编写地图文字样式,Java核心库中没有替代品*.在我看来,xpmatteo的答案不符合文字风格.必须为每个子类创建一个子类(这是双支撑初始化真正做的),这也不太理想. (6认同)

Bal*_*usC 15

常数?我会用枚举.

public enum Constants { 
    NAME_1("Value1"),
    NAME_2("Value2"),
    NAME_3("Value3");

    private String value;

    Constants(String value) {
        this.value = value;
    }

    public String value() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,NAME_2可以获得以下值:

String name2value = Constants.NAME_2.value();
Run Code Online (Sandbox Code Playgroud)

只给枚举一点更明智的名称,例如Settings,Defaults等,无论这些名称/值对实际代表.