Java 不使用许多if-else语句编写代码
这是我的if和else if代码逻辑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
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站点之间的范围和规则差异的详细信息,请参阅他们的元站点)。