[英]Why would I use an Enum, and not just a class?
前几天我正在用Java帮助一个朋友,他们问的是Enums。 我解释了C语法(类似的东西)
enumeration Difficulty{
BEGINNER= 1;
PRO=5;
EXPERT = 11;
}
不是要走的路,Java语法是something(1);
你做了一个接受一个int的构造函数然后做了这个和那个......等等。
但是他们阻止了我并且问道:“如果我们使用构造函数等等,为什么还要使用枚举,为什么不只是有一个新的类?”
我无法回答。 那么为什么你会在这种情况下使用枚举,而不是一个类?
枚举严格限制。 无法在指定值之外定义枚举值(而对于类,您可以调用new
来创建新值)。
至少大多数JVM也对枚举进行了大量优化,并且还有新的类和语言功能,这些功能利用了枚举的紧凑性和速度。 例如,创建了新类EnumSet
和EnumMap
,它们分别使用bitset和数组实现枚举键集或映射(这些可能是这些抽象数据类型的最快实现)。
此外,枚举类型可以在switch
语句中使用。 如果你是Java1.7之前的版本,那么这是自定义switch
语句的最佳选择(由于类型安全,它仍然可能优于使用String
值;错误输入枚举值会导致编译时错误,但是错误输入字符串会导致更加阴险的运行时错误 - 或者更糟糕的是,在您真正盯着代码并查看错字之前,您无法理解的逻辑错误。
枚举具有平原类没有的许多功能。
嗯,实际上java中的Enum只是用于声明整个类层次结构的语法糖。
写作:
public enum MyEnum {
FOO, BAR
}
大致相当于写作
public abstract class MyEnum {
public static final MyEnum FOO = new MyEnum(){};
public static final MyEnum BAR = new MyEnum(){};
private MyEnum(){}
}
一开始看起来有点矫枉过正,但是你意识到你可以做所有类可以做的事情,例如:
public enum Operators {
ADD("+"){
public double apply(double lhs, double rhs){ return lhs + rhs; }
},
SUBTRACT("-"){
public double apply(double lhs, double rhs){ return lhs - rhs; }
},
MULTIPLY("*"){
public double apply(double lhs, double rhs){ return lhs * rhs; }
},
DIVIDE("/"){
public double apply(double lhs, double rhs){ return lhs / rhs; }
};
private final String symbol;
Operators(String symbol){
this.symbol = symbol;
}
public abstract double apply(double lhs, double rhs);
}
现在这相当于(加上一些额外的便利方法):
public abstract class Operators {
public static final Operators ADD = new Operators("+"){
public double apply(double lhs, double rhs){ return lhs + rhs; }
};
public static final Operators SUBTRACT = new Operators("-"){
public double apply(double lhs, double rhs){ return lhs - rhs; }
};
public static final Operators MULTIPLY = new Operators("*"){
public double apply(double lhs, double rhs){ return lhs * rhs; }
},
public static final Operators DIVIDE = new Operators("/"){
public double apply(double lhs, double rhs){ return lhs / rhs; }
};
private final String symbol;
private Operators(String symbol){
this.symbol = symbol;
}
public abstract double apply(double lhs, double rhs);
}
我相信我们能够达成一致意见比非常基本的C版本强大得多。 当然,使用枚举可以保证枚举的每个成员都是单身。
以下是使用Enums的原因 -
1)枚举是类型安全的,你不能将除预定义的枚举常量之外的任何东西分配给枚举变量。
2)Enum有自己的名字空间。
3)Enum的最大特点是你可以在Switch语句中使用Enum in Java,如int或char原始数据类型。 但是在java 7中我们可以在switch语句中使用String。
4)在Java中使用Enum添加新常量非常简单,您可以在不破坏现有代码的情况下添加新常量。
Enum还在Java中创建了一个很棒的单例:
http://en.wikipedia.org/wiki/Singleton_pattern#The_Enum_way
我想这是另一种情况,你可以使用枚举而不是类。
如果你有一组修复值,你可以使用枚举,枚举在...... ehhm ...枚举:)
如果您想要类所描述的任何数量的实例,则可以使用类。
因为一个类可以有任意数量的实例,而在“枚举”中,实例的数量有限于枚举本身的元素(这就是构造函数必须是私有的),并且这些实例可以静态访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.