[英]Alternative ways for hard-coding Map in Java?
我的Java程序中有一个HashMap,它由大约200个-Key-Value-pairs组成,它们在运行时不会改变,我正在寻找一种初始化所有对的好方法。 目前,我有一个像这样的硬编码方法
private void initializeHashMap(){
hashMap.put(1, "String1");
hashMap.put(2, "String2");
hashMap.put(3, "String3");
...}
对于所有200对。 那真的是一个好习惯吗,或者还有另一种更好的方法可以从另一个类或外部文件中读取数据?
这是考虑属性文件的完美用例。 读取文件时,它会为您提供方便的地图以供您使用。
在可读性方面较差但在简洁方面更好的替代方案(我将在个人项目中使用,但在团队工作中避免使用)将是使用匿名类,该类在实例化时定义其键/值:
Map<Integer,String> myMap = new HashMap<Integer,String>(){{
this.put(1, "String1");
this.put(2, "String2");
}};
现在,您不再实例化HashMap
,而是实例化它的匿名类。 这个匿名类的定义包含一个实例初始化程序块,该实例初始化程序块将在构造函数之后执行并设置所需的键/值。
我发现使用硬编码数组的流传输可能是一种非常简洁的方法。
String[] contents = new String[] {
"1:String1",
"2:String2",
"3:String3"
};
Map<Integer,String> hashMap = Arrays.stream(contents)
.collect(Collectors.toMap(
// Key.
s -> Integer.valueOf(s.split(":")[0]),
// Value.
s -> s.split(":")[1]
));
数据列表更易于维护,例如,您通常可以从电子表格中更新数据列表。
您可以考虑使用属性文件,因为它将返回您的映射,并有助于配置和测试。
如果您有兴趣为其维护一个单独的类,则可以继续使用实例块,
public Class Data{
private static class MyMap extends HashMap<Integer, String>{
private static final long serialVersionUID=1l;
private MyMap(){
this.put(1,"string1");
this.put(2,"string2");
this.put(3,"string3");
this.put(4,"string4");
}
}
public static final Map<Integer, String> fixedData=Collections.unmodifiable(new MyMap());
}
然后,在您的课堂上,您可以如下使用它。
Class YourClass{
private static final Map<Integer, String> map;
static{
map=Data.fixedData;
}
public final String getValue(final int key){
return map.containsKey(key) ? map.get(key) : "";
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.