在功能标志下维护不同版本的Java方法

时间:2018-08-01 12:50:38

标签: java-8

考虑SomeService.class中的follow方法

List<SomeObject> getSomeObjectDetails(String s){
    someRepo.get(s);
}

现在让我们说我想拥有一个可以关闭或打开的功能标志,并且根据其值,它将执行不同的操作。我发现这样做的方法是使用简单的if

List<SomeObject> getSomeObjectDetails(String s){
    if(someFeatureFlag == false){
      someRepo.get(s);
    } else {
      newRepo.get(s);
    }
}

我发现这段代码令人震惊,并且想到了使用功能标记干扰来维护不同代码版本的想法。 仅基于功能标志遵循正确的代码路径,此方法是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

Map

 Map<Boolean, Function<String, List<SomeObject>>> map = new HashMap<>();
 map.put(false, someRepo::get);
 map.put(true,  newRepo::get)

以及以后的用法:

 List<SomeObject> getSomeObjectDetails(String s, boolean someFlag){
     return map.get(someFlag).apply(s);
 }

如果您认为以后可以有更多案例,请考虑引入enum

 enum Version {
    FIRST,
    SECOND,
    THIRD
 }


 FirsRepo fr = new FirsRepo();
 EnumMap<Version, Function<String, List<SomeObject>>> map = new EnumMap<>(Version.class);
 map.put(Version.FIRST, fr::get);
 // all others...


 List<SomeObject> getSomeObjectDetails(String s, Version version){
     map.get(version).apply(s);
 }