Java 这是使用枚举的正确方法吗?

Java 这是使用枚举的正确方法吗?,java,class,oop,enums,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_THA

因此,我有一个名为
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呢?

看看

尽管它是在C#上下文中编写的,但结论指出:

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

在java
enum
s中,与其他语言(如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);
  }
}
类计算器{
枚举操作{
加{
双重计算(双重a,双重b){返回a+b;}
}
潜艇{
双重计算(双重a,双重b){返回a-b;}
}
骡子{
双重计算(双重a,双重b){返回a*b;}
}
DIV{
双重计算(双重a,双重b){返回a/b;}
}
抽象双计算(双a,双b);
}
映射操作=新的HashMap();
计算器(){
运算。put(“+”,ADD);
操作。put(“-”,SUB);
操作。put(“*”,MUL);
操作。put(“/”,DIV);
}
公共双计算(双a、字符串操作、双b){
返回操作.get(操作).calculate(a,b);
}
}
重点是“如何在运行时使用这些信息”。你看,如果你开始考虑写代码,比如

switch(someEnum) {
  case DO_THIS: ...
  case DO_THAT:
。。。那你已经走错方向了

要点是:很多人认为枚举(或其更低级的数值常量表)是表达此类设计的好方法

但这实际上导致了相当多的问题。通常,更好的“更面向对象”的方法是使用带有特定子类的抽象基类;换句话说:多态性


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

一个
enum
的名称通常与任何其他
类一样位于标题库中,即
OptionType
,我建议使用
enum
,因为作为开发人员,您不需要知道该选项的值及其含义,您只需要使用所需的枚举。@ValterHenrique枚举和枚举之间有区别吗?枚举值是常量,但是所有枚举类都是类,应该有正常的类名。所有
enum
类都是类
enum
的子类注意:每个枚举都可以定义运算符,例如
ADD(“+”)
@PeterLawrey:当然,但我给OP时间来仔细思考这个例子……switch语句确实正是我计划要做的;为什么这是错误的方向?有什么害处?你是怎么把这么小的东西做成“多态”的?谷歌搜索了一下,你是说这样的吗?不客气!还有一个新手用谷歌优化答案。。。这值得两次投票;-)