设计问题|枚举表示组合框选项

时间:2011-11-26 20:06:43

标签: java

我需要使用带有组合框的枚举(值如下所示)。

YES (shown as YES on UI, stored in DB as Y)
NO (shown as NO on UI, stored in DB as N)
DEFAULT (shown as "" on UI, stored in DB as null)

Enum有方法可以执行以下操作 -

  1. toString() - 为UI提供自定义String。 (显示组合选项)
  2. OptionToDB(静态) - 将所选选项转换为db值(在保存/更新时)
  3. DBToOption(static) - 将DB值转换为selcted选项(加载屏幕时)

    static enum EnumOption{
        YES,NO,DEFAULT;
        ....
        public static EnumOption DBToOption(String val){
            if("Y".equals(val)){
                return YES;
            } else if("N".equals(val)){
                return NO;
            }else {
                return DEFAULT;
            }
        }
        ....
    }
    
  4. 它工作得很好,但上述方法的问题在于它使用if / else比较来推断要返回的选项/ db值。

    我想将dbValue存储为枚举中的字段,但我无法从DBToOption中减少if / else。

    使用更好的设计可以以任何方式避免使用if / else吗?

3 个答案:

答案 0 :(得分:4)

如果您将dbValue作为字段存储在enum中,则可以删除if / else并将其替换为for-loop,但我没有看到任何错误。 / elses for this case:

static enum EnumOption {
  YES("Y"),
  NO("N"),
  DEFAULT("");

  private final String value;

  private EnumOption(String value) {
    this.value = value;
  }

  public static EnumOption DBToOption(String val) {
    for (EnumOption opt : EnumOption.values()) {
      if (opt.value.equals(val)) {
        return opt;
      }
    }
    return DEFAULT;
  }
}

答案 1 :(得分:3)

public enum EnumOption {

   YES("Y"), NO("N"), DEFAULT("");

   private final String value;

   private final static Map<String, EnumOption> options;

   static {
          options = new HashMap<String, EnumOption>();
          for (EnumOption opt : EnumOption.values()) {
                 options.put(opt.value, opt);
          }
   }

   private EnumOption(String value) {
          this.value = value;
   }

   public static EnumOption DBToOption(String val) {
          return options.get(val) != null ? options.get(val) : DEFAULT;
   }
}

以下测试证明它有效。

public void testDBToOption() {      
    assertEquals(EnumOption.NO, EnumOption.DBToOption("N"));
    assertEquals(EnumOption.YES, EnumOption.DBToOption("Y"));
    assertEquals(EnumOption.DEFAULT, EnumOption.DBToOption(""));
    assertEquals(EnumOption.DEFAULT, EnumOption.DBToOption(null));
    assertEquals(EnumOption.DEFAULT, EnumOption.DBToOption("R"));
}

答案 2 :(得分:0)

所以你想要摆脱余下的if / else ......你在做Object Calisthenics吗?

如果您没有兼容性问题,可以执行以下操作:

public enum EnumOption {

   Y("Y", "YES"), 
   N("N", "NO"), 
   D("D", "");

   private final String dbValue;
   private final String uiValue;

   private EnumOption(String dbValue, String uiValue) {
          this.dbValue = dbValue;
          this.uiValue = uiValue;
   }

   public String getDbValue() {
     return this.dbValue;
   }

   public String uiValue() {
      return this.uiValue;
   }

   public static EnumOption getFromDb(String dbValue) {
        return EnumOption.valueOf(dbValue);
   }
}

由于每个枚举值只能出现一次,因此至少具有与所有其他实现相同的性能。

有关枚举类型中自动生成的valueOf(String)方法和James DW解决方案的详细信息,您可以阅读Josh Bloch的Effective Java Item 30(使用枚举而不是int常量),第154页。

相关问题