我想知道在Java应用程序中使用某些全局映射的最佳做法是什么?
说我有一个带有映射的文本文件:
key1:value1
key2:value2
...
keyN:valueN
文件很大,键和值都是任意的,所以我无法真正使用Enum。
在Java应用程序中,我将使用键作为输入来实例化一堆类(注意代码在现实中更加充分,只是试图将其抽象化和简单化):
for(int i = 0; i < 10000; i++) {
String key = magicallyGetArbitaryKey();
SomeClass someClass = new SomeClass(key);
//do stuff
}
并根据地图查找在构造函数中指定属性。
public class SomeClass {
private String value;
public void SomeClass(String key) {
this.value = getValue(key);
}
private String getValue() {
// what is the best way to implement this?
}
}
我希望我的代码简单,重要的是,可测试的。并避免使用Spring等框架。
这是我到目前为止所提出的:创建一个Holder类,它只是一个围绕HashMap的包装器,带有其他初始化方法:
class MappingHolder {
private Map<String, String> keyValueMap = new HashMap();
public MappingHolder(String filePath){
keyValueMap = ...; //init from the file
}
public MappingHolder(Map initMap) { //constructor useful for testing
keyValueMap = initMap;
}
public String get(String key) {
return keyValueMap.get(key);
}
似乎很明显我想只有一个映射实例。
据我所知,选项包括:
将MappingHolder#getValue作为静态方法
public class SomeClass {
...
private String getValue() {
return MappingHolder.getValue()
}
将MappingHolder#getValue作为实例方法,但make SomeClass中的MappingHolder类型的字段
public class SomeClass {
...
private static MappingHolder mappingHolder = new MappingHolder();
private String getValue() {
return mappingHolder.getValue();
}
使MapppingHolder成为单身人士。
public class SomeClass {
...
private MappingHolder mappingHolder = MappingHolder.getInstance();
private String getValue() {
return mappingHolder.getValue();
}
这对我来说似乎都不可测试,只有JUnit和Mockito并没有利用一些更强大的模拟框架。虽然我很糟糕,但也许我错了。
如果能够推荐这种方法,或者如何进一步发展自己的方法,或者我可能缺少的方法,那就更好了。谢谢!