这是使用Enum的正确方法吗?

时间:2016-11-02 18:45:35

标签: java class oop enums

所以我有一个名为optionType的字段,我希望它能够采用对应于某些选项的4个不同的整数值。例如,optionType = 0表示用户想要以某种方式处理某些内容,optionType = 1表示另一种方式,等等。

但数字本身没有意义,所以我想在类中定义常量。

public class MyClass {
    public static final int OPTION_TYPE_DO_THIS = 0;
    public static final int OPTION_TYPE_DO_THAT = 1;
    public static final int OPTION_TYPE_DO_SOMETHING_ELSE = 2;
    public static final int OPTION_TYPE_DO_COOL_THING = 3;
    private int optionType;

    ....

将所有常量定义为这样是否被认为是正常的,或者使用像

这样的枚举更好
public enum OPTION_TYPE {DO_THIS, DO_THAT, DO_SOMETHING_ELSE, DO_COOL_THING};

或者我应该以某种方式使用Enum?

3 个答案:

答案 0 :(得分:1)

关键点在于“如何在运行时使用该信息”。你看,如果你开始考虑编写代码,比如

switch(someEnum) {
  case DO_THIS: ...
  case DO_THAT:

...那么你已经走错了方向!

重点是:经常认为枚举(或者甚至更低级别的数字常数表兄弟)是表达此类设计的好方法。

但实际上这导致了一些问题。通常,更好的“更多OO”方式是使用一些具有特定子类的抽象基类;换句话说:多态!

编辑:只是为了让它更清晰......对枚举进行“单一”切换并不是真正的问题。但是很多时候,人们在代码中会有很多地方切换到他们的枚举。当您创建其他枚举常量时,所有这些位置可能都需要更新。我的一位同事称之为“枚举陷阱”。

答案 1 :(得分:0)

看看this question and answer

即使它是在C#语境中编写的,结论也表明:

  
      
  • 枚举非常适合轻量级状态信息。
  •   
  • 静态类成员将能够支持此多状态而无需任何额外功能。
  •   

答案 2 :(得分:0)

在java enum中,不仅仅是“枚举名称”,因为它们在其他语言中(例如在C / C ++中)。

我的首选用途是提供无国籍行为:

class Calculator {
  enum Operation {
     ADD{
        double calculate(double a, double b){ return a + b;}
     }
     SUB{
        double calculate(double a, double b){ return a - b;}
     }
     MUL{
        double calculate(double a, double b){ return a * b;}
     }
     DIV{
        double calculate(double a, double b){ return a / b;}
     }
     abstract double calculate(double a, double b);
  }

  Map<String,Operation> operations = new HashMap<>();
  Calculator(){
    operations.put("+",ADD);
    operations.put("-",SUB);
    operations.put("*",MUL);
    operations.put("/",DIV);
  }

  public double calculate(double a, String operation, double b){
    return operations.get(operation).calculate(a,b);
  }
}