首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是使用Enum的正确方式吗?

这是使用Enum的正确方式吗?
EN

Stack Overflow用户
提问于 2016-11-02 18:45:34
回答 3查看 446关注 0票数 2

因此,我有一个名为optionType的字段,我希望它能够接受与某些选项对应的4个不同的整数值。例如,optionType =0表示用户希望以某种方式处理某事,optionType =1表示另一种方式,等等。

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

代码语言:javascript
复制
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;

    ....

这样定义所有常量被认为是正常的,还是使用枚举更好呢?

代码语言:javascript
复制
public enum OPTION_TYPE {DO_THIS, DO_THAT, DO_SOMETHING_ELSE, DO_COOL_THING};

还是我应该以某种方式使用Enum?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-02 19:00:19

重点是“如何在运行时使用这些信息”。你看,如果你开始考虑写代码,比如

代码语言:javascript
复制
switch(someEnum) {
  case DO_THIS: ...
  case DO_THAT:

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

要点是:经常认为枚举(或它们更低水平的数值常数表亲)是表达这种设计的好方法。

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-11-02 18:50:23

看看this question and answer

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

  • Enum非常适合轻量级的状态信息。
  • 静态类成员将能够支持这种多重状态,而不需要任何额外的功能。
票数 0
EN

Stack Overflow用户

发布于 2016-11-02 18:58:29

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

我的首选用途是提供无状态行为:

代码语言:javascript
复制
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);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40387529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档