如何在不写"if语句"的情况下初始化输入字段?

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)

pla*_*nes 5

听起来像你的设计可能需要被关注.一些建议:

  • 将init方法添加到枚举中.那么你可以遍历你的枚举数组并在其上调用init方法,因此枚举知道如何进行自己的初始化
  • 创建一个Command对象,该对象执行初始化并创建枚举的Map作为键,将Command作为值.为每个枚举循环运行Command的地图.
  • 使用反射 - 成本方面我不会太在意这一点,除非你的系统经历了令人难以置信的低延迟

对于第一个项目符号,您可以更改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相关联,正如我在上面的构造函数示例中所演示的那样.

  • @hilal - 紧张不是正确的词.请查看常见问题解答,它可以帮助您改善与花时间帮助您解决问题的人的关系. (2认同)