嘿,我非常喜欢在Java中使用Enumerated Types来帮助提高代码的可读性和限制无效值。但是,有人告诉我,使用枚举可以在Java中完成更多工作,而不仅仅是创建一组可能值的命名组。
有人可以列出Java的枚举所允许的基本功能,以及一个示例,或者可能是我可以获得有关该功能的更多信息的位置吗?
非常感谢, 黑菜
编辑: 正如所建议的那样,这个问题应该是在Java中枚举和类之间存在哪些差异。我不知道他们那么强大吗?那么有什么不同?
答案 0 :(得分:4)
Java的enum
基本上是一个成熟的类。
您可以:
但你不能:
enum
已经隐式扩展java.lang.Enum
而Java只支持单实现继承)。他们有:
valueOf
和values
答案 1 :(得分:3)
枚举和普通类之间的差异主要是JVM处理枚举所给予的保证。
假设您有一个枚举类(MyEnum),其值为(VALUE1和VALUE2)。您可以保证该枚举类的构造函数只能在JVM *中执行两次,在序列化和反序列化VALUE1和VALUE2时,您可以保证每次都获得相同的对象,这样对象相等就可以了(而不是与其他类保证...(例如"Foo" == new String("Foo")
可能返回false)。
此外,每个枚举类都会扩展Enum<T extends Enum<T>>
,以便您可以根据需要使用这些枚举类型(学习爱name()
和valueOf()
)。
*类加载器是一项棘手的业务......是的,这里有一点例外。
答案 2 :(得分:2)
他们有很多东西,其他人已经说过了。
让我再介绍一下你可以找到的用途。我用它们作为对象的原型。这种方式而不是通过网络发送整个对象,我只是发送一个原型标识符。下面我将介绍一个简单的游戏示例,我将其编写为有趣和实践的代码。
public enum SimpleUnits
{
BROTHERHOOD_ELITE_TROOPER,
CAPITOL_FREE_MARINE,
IMPERIAL_BLOOD_BERET;
public static SimpleUnit getUnit(SimpleUnits unit)
{
SimpleUnit result = null;
// new SimpleUnit(enumeName, hpMax, speed, CC, MW, PW, LD, ST, MV, AC, W, A, COST);
switch(unit)
{
case BROTHERHOOD_ELITE_TROOPER:
result = new SimpleUnit(BROTHERHOOD_ELITE_TROOPER.name(), 5, 0.15, 12, 12, 12, 12, 3,
5, 3, 2, 1, 100, "images/units/eliteTrooper.png");
break;
case CAPITOL_FREE_MARINE:
result = new SimpleUnit(CAPITOL_FREE_MARINE.name(), 5, 0.15, 12, 12, 12, 12, 3,
5, 3, 2, 1, 100, "images/units/freeMarine.png");
break;
case IMPERIAL_BLOOD_BERET:
result = new SimpleUnit(IMPERIAL_BLOOD_BERET.name(), 5, 0.15, 12, 12, 12, 12, 3,
5, 3, 2, 1, 100, "images/units/bloodBeret.png");
break;
}
return result;
}
public SimpleUnit getUnit()
{
return SimpleUnits.getUnit(this);
}
public static SimpleUnit getUnit(String enumeName)
{
return SimpleUnits.valueOf(enumeName).getUnit();
}
}
希望你觉得它很有用。