什么是java枚举?他们是如何工作的?我在哪里可以使用它们以及如何?
我可以不在应用程序中使用枚举,或者它们是如此强大以至于使用它们比忽略它们更好吗?
cle*_*tus 49
Java 5+中的枚举基本上是具有预定义实例集的类.它们旨在替代整数常量的集合.它们最好是常数,因为它们可以强制类型安全.
所以代替:
public class Suit {
public final static int SPADES = 1;
public final static int CLUBS = 2
public final static int HEARTS = 3;
public final static int DIAMONDS = 4;
}
Run Code Online (Sandbox Code Playgroud)
你有:
public enum Suit {
SPADES, CLUBS, HEARTS, DIAMONDS
}
Run Code Online (Sandbox Code Playgroud)
优点是:
类型安全是一个问题,因为在第一个示例中,这些是有效的语句:
int i = Suit.DIAMONDS * Suit.CLUBS;
Run Code Online (Sandbox Code Playgroud)
或者你可以将11传递给期待西装的功能.你不能用类型安全的枚举来做到这一点.
您可以使用Suit类来提供类型安全性,这是Java 5之前的解决方案.Josh Bloch(在Effective Java中,这是Java程序员imho 必读的内容)提升了类型安全枚举模式,该模式成为Java 5+枚举.它上面有相当数量的样板和人们不倾向于满足的一些极端情况,例如序列化没有调用构造函数,并且确保只有一个实例必须覆盖readResolve()方法.
例如:
public enum CardColour {
RED, BLACK
}
public enum Suit {
SPADES(CardColour.BLACK),
CLUBS(CardColour.BLACK),
HEARTS(CardColour.RED),
DIAMONDS(CardColour.RED);
private final CardColour colour;
Suit(CardColour colour) { this.colour = colour; }
public CardColour getColour() { return colour; }
}
Run Code Online (Sandbox Code Playgroud)
编辑: Sun 介绍了类型安全的枚举.
至于接口,它们确实补充了枚举而不是替代.就像你可以说Suit是一个界面,你有这个:
public interface Suit {
CardColour getColour();
}
Run Code Online (Sandbox Code Playgroud)
问题是你可以去定义300种不同的套装,你也可以多次定义黑桃.枚举的另一个优点是(尽管有类加载极端情况)是每个枚举值只有一个实例.通常,这被称为具有规范值,这意味着此等式成立:
a.equals(b) == b.equals(a) == (a == b)
Run Code Online (Sandbox Code Playgroud)
对于所有a,b,它们是特定枚举的实例.这意味着不是写作:
if (card.getSuit().equals(Suit.SPADES)) { ... }
Run Code Online (Sandbox Code Playgroud)
你可以写:
if (card.getSuit() == Suit.SPADES) { ... }
Run Code Online (Sandbox Code Playgroud)
这更快,通常更容易阅读.如果您正在比较不同类型的枚举,说它们可能不相等,那么IDE通常会给您反馈,这可能是一种有用且早期的错误检查形式.
Art*_*ald 18
想想Enum如下
public class MyEnum {
// Object instantiated at declaration
public static final MyEnum ONE = new MyEnum();
public static final MyEnum TWO = new MyEnum();
public static final MyEnum THREE = new MyEnum();
// Notice a private constructor
// There is no way outside MyEnum class call it
private MyEnum() { ... }
}
Run Code Online (Sandbox Code Playgroud)
因此,作为枚举的MyEnum将是
public enum MyEnum {
ONE,
TWO,
THREE;
}
Run Code Online (Sandbox Code Playgroud)
两者都相似
问候,
| 归档时间: |
|
| 查看次数: |
18239 次 |
| 最近记录: |