【问题标题】:Is this a correct way to use Enum?这是使用枚举的正确方法吗?
【发布时间】:2016-11-02 18:45:34
【问题描述】:

所以我有一个名为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 吗?

【问题讨论】:

  • enum 的名称通常在 TitleCase 中,就像任何其他 classOptionType
  • 我建议使用Enum,因为作为开发人员,您不需要知道选项的值及其含义,您只需要使用您的枚举需要。
  • @ValterHenrique enum 和 Enum 有区别吗?
  • 枚举值是常量,但所有枚举类都是类,应该有正常的类名。
  • 所有enum类都是Enum类的子类

标签: java class oop enums


【解决方案1】:

关键点更多地在于“如何在运行时使用这些信息”。你看,如果你开始考虑编写诸如

之类的代码
switch(someEnum) {
  case DO_THIS: ...
  case DO_THAT:

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

重点是:通常认为枚举(或它们的更底层的数字常量表亲)是表达此类设计的好方法。

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

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

【讨论】:

  • 那个switch语句确实是我打算做的;为什么这是错误的方向?有什么害处?像这种“多态”的小东西是怎么做出来的?
  • 谷歌了一下,你说的是这样的吗? stackoverflow.com/a/6392518/7086932
  • 不客气!还有一个新手使用谷歌来完善答案......值得双重支持;-)
【解决方案2】:

看看this question and answer

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

  • 枚举非常适合用于轻量级状态信息。
  • 静态类成员无需任何额外功能即可支持这种多状态。

【讨论】:

    【解决方案3】:

    在 java 中,enums 不仅仅是“枚举名称”,因为它们在其他语言中(例如在 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);
      }
    }
    

    【讨论】:

    • 注意:每个枚举都可以定义运算符,例如ADD("+")
    • @PeterLawrey:当然,但我给 OP 时间考虑这个例子...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 2012-05-11
    • 2018-12-31
    • 2021-04-29
    相关资源
    最近更新 更多