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语句确实正是我计划要做的;为什么这是错误的方向?有什么害处?你是怎么把这么小的东西做成“多态”的?谷歌搜索了一下,你是说这样的吗?不客气!还有一个新手用谷歌优化答案。。。这值得两次投票;-)