Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用许多if-else语句编写代码_Java - Fatal编程技术网

Java 不使用许多if-else语句编写代码

Java 不使用许多if-else语句编写代码,java,Java,这是我的if和else if代码逻辑 Search search = new Search(); Request request = new Request() Client client = new Client(); String typeA = data.getTypeA(); // data object passing as argument to method String typeB = data.getTypeB(); String typeC = data.getType

这是我的if和else if代码逻辑

Search search = new Search(); 
Request request = new Request()
Client client = new Client();

String typeA = data.getTypeA();  // data object passing as argument to method
String typeB = data.getTypeB();
String typeC = data.getTypeC();
String typeD = data.getTypeD();

if(typeA!=null) {
    search.setType("A");  
    search.setValue(typeA);  // Type A value   
    request.setSerach(search);  
    return client.invokeTypeA(request);
}
else if(typeB!=null){
    search.setType("B");  
    search.setValue(typeB);  // Type B value   
    request.setSerach(search);  
    return client.invokeTypeB(request); 
}
else if (typeC!=null){
      ... 
      ... 
    return client.invokeTypeC(request); 
}
else if(typeD!=null){
      ... 
      ... 
    return client.invokeTypeD(request); 
}

这里的代码工作得很好,但我只需要知道,有没有其他方法可以不使用if和elseif来实现相同的功能。诅咒开关当然存在,但我相信其他一些好的方法也会出现。我不期望得到确切的解决方案,至少如果我知道,其他方法,我将深入研究,并提高我的编码技能。请为我的功能提供一些基本的替代方法。

没有“插入式”答案;如果有,那就意味着有两种方法可以做完全相同的事情,这是糟糕的语言设计,所以这是一件好事

当然,也有替代方案,但它们不是“插入式”的,它们需要围绕if/elseif块的代码来更改

例如,假设数据具有
.getTypeInfos()
,它返回
TypeInfo
对象。TypeInfo类似于:

@Value
public class TypeInfo {
    String resultText;
    SearchType type;
}

public enum SearchType {
    A, B, C, D;
}
注意:
TypeInfo
是个可怕的名字。但是,您的代码片段已删除了所有上下文信息

然后你可以做:

for (TypeInfo info : data.getTypeInfos()) {
    if (info.getResultText() == null) continue;
    search.setType(info.getType());
    search.setValue(info.getResultText());
    request.setSearch(search);
    return client.invoke(request);
}
Java具有高度的规范性和结构化;一旦您决定创建一个名为
getTypeA
的方法和一个名为
getTypeB
的方法,现在就很难尝试编写代码,其中要调用的方法的名称的概念是一个参数。所以,不要这样做。如果
getTypeA()
getTypeB()
的结构类似,则创建一个名为
getType(Type t)
或诸如此类的方法


如果你编写了一系列名为
typeA
typeB
,等等的方法,是的,你最终会得到大量的代码和大量的长If/elseif链。这就是为什么您通常不应该这样做。

根据我在代码中的理解,您要求配置来设置搜索

因此,在面向对象的开发风格中,您应该避免提出以下问题:

if (type is X) 
   ...
else if (type is Y) 
   ...
else if (type is Z)
这被认为是糟糕的OO设计

面向对象的方法是使用动态分派。因此,您将拥有一个由UI配置的过滤器类,然后您将使其对搜索应用更改,如下所示:

filter.applyOn(search);
request.setSearch(search);
client.invoke(search);
DataType type = data.getType();

// where
abstract class DataType {
    // lambda
    public static DataType instanceFor(....) {
        return (search) ->
            {  search.setType(this.getName()); .... };   
    }

    public abstract void applyOn(Search search);
}
map.put("valueA", this::methodA);
map.put("valueB", this::methodB);
map.put("valueC", this::methodC);

map.computeIfAbsent(data.getType(), (s,r,c) -> {}).apply(search,request,client);
然后添加如下所示的枚举或类:

filter.applyOn(search);
request.setSearch(search);
client.invoke(search);
DataType type = data.getType();

// where
abstract class DataType {
    // lambda
    public static DataType instanceFor(....) {
        return (search) ->
            {  search.setType(this.getName()); .... };   
    }

    public abstract void applyOn(Search search);
}
map.put("valueA", this::methodA);
map.put("valueB", this::methodB);
map.put("valueC", this::methodC);

map.computeIfAbsent(data.getType(), (s,r,c) -> {}).apply(search,request,client);

但是如果这是不可能的,你必须使用一些if if语句,考虑使用一个映射,而不是这样:

filter.applyOn(search);
request.setSearch(search);
client.invoke(search);
DataType type = data.getType();

// where
abstract class DataType {
    // lambda
    public static DataType instanceFor(....) {
        return (search) ->
            {  search.setType(this.getName()); .... };   
    }

    public abstract void applyOn(Search search);
}
map.put("valueA", this::methodA);
map.put("valueB", this::methodB);
map.put("valueC", this::methodC);

map.computeIfAbsent(data.getType(), (s,r,c) -> {}).apply(search,request,client);

这是避免ifs的另一种方法。

数据。getTypeX
方法不应返回可为空的结果。它应该是
data.getType
,返回接口的4种不同实现中的1种。注意,与实现问题相反的设计问题通常更适合我们的姐妹站点。(也就是说,不要仅仅因为这里有人说要在那里重新发布某些内容!有关这两个Stack Exchange站点之间的范围和规则差异的详细信息,请参阅他们的元站点)。