所以我有一个名为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?
答案 0 :(得分:1)
关键点在于“如何在运行时使用该信息”。你看,如果你开始考虑编写代码,比如
switch(someEnum) {
case DO_THIS: ...
case DO_THAT:
...那么你已经走错了方向!
重点是:经常认为枚举(或者甚至更低级别的数字常数表兄弟)是表达此类设计的好方法。
但实际上这导致了一些问题。通常,更好的“更多OO”方式是使用一些具有特定子类的抽象基类;换句话说:多态!
编辑:只是为了让它更清晰......对枚举进行“单一”切换并不是真正的问题。但是很多时候,人们在代码中会有很多地方切换到他们的枚举。当您创建其他枚举常量时,所有这些位置可能都需要更新。我的一位同事称之为“枚举陷阱”。
答案 1 :(得分:0)
答案 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);
}
}