3 java design-patterns enumeration if-statement
我有一个类似的枚举
public enum Field {
A, B, C, D, E ....;
private Field(){
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个class Panel是需要Field array初始化字段:
public class Panel {
TextBox A;
TextBox B;
TextBox C;
TextBox D;
TextBox E;
...
public Panel(Field[] fields){
this.fields = fields;
init();
}
public void initA(){}
public void initB(){}
public void initC(){}
public void initD(){}
public void initE(){}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在不编写if语句的情况下初始化给定的字段?
我找不到任何解决方案,我现在正在初始化,如下所示:
public void init(){
for(int i = 0 ; i < fields.length; i++){
if(fields[i] == Field.A){
initA();
} else if(fields[i] == Field.B){
initB();
} else if(fields[i] == Field.C){
initC();
} else if(fields[i] == Field.D){
initD();
} else if(fields[i] == Field.E){
initE();
} ....
}
}
Run Code Online (Sandbox Code Playgroud)
听起来像你的设计可能需要被关注.一些建议:
对于第一个项目符号,您可以更改TextBox以保持Field类型,例如
TextBox A = new TextBox(Field.A);
TextBox B = new TextBox(Field.B);
Run Code Online (Sandbox Code Playgroud)
因此,如果TextBox知道它是A,B,C,D,E,那么你只需要循环你的Field [],当它找到它的东西TextBox运行init代码(可以针对特定的枚举实例存储).当然,您需要在某个地方的数据结构中注册所有TextBox实例,因为您似乎非常反对使用非常广泛使用的反射API.
本质上,Field和TextBox之间必须有一个链接.如果没有你的说法,Java就无法读懂你的想法.好吧,至少在Google推出他们的心灵感应API之前(这可能只适用于Go ......).这可以基于命名(反射),硬编码逻辑(ifs或开关)或基于状态来完成.对于后者,这意味着将Field与TextBox相关联,正如我在上面的构造函数示例中所演示的那样.