Java应用程序中的全局映射

时间:2017-07-18 12:54:08

标签: java unit-testing design-patterns tdd application-design

我想知道在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);
}

似乎很明显我想只有一个映射实例。

据我所知,选项包括:

  1. 将MappingHolder#getValue作为静态方法

    public class SomeClass {
    ...
    private String getValue() {
       return MappingHolder.getValue()
    }
    
  2. 将MappingHolder#getValue作为实例方法,但make SomeClass中的MappingHolder类型的字段

    public class SomeClass {
    ...
    private static MappingHolder mappingHolder = new MappingHolder();
    private String getValue() {
       return mappingHolder.getValue();
    }
    
  3. 使MapppingHolder成为单身人士。

    public class SomeClass {
    ...
    private MappingHolder mappingHolder = MappingHolder.getInstance();
    private String getValue() {
       return mappingHolder.getValue();
    }
    
  4. 这对我来说似乎都不可测试,只有JUnit和Mockito并没有利用一些更强大的模拟框架。虽然我很糟糕,但也许我错了。

    如果能够推荐这种方法,或者如何进一步发展自己的方法,或者我可能缺少的方法,那就更好了。谢谢!

0 个答案:

没有答案