Java枚举类型:功能

时间:2011-05-28 14:12:51

标签: java enums

嘿,我非常喜欢在Java中使用Enumerated Types来帮助提高代码的可读性和限制无效值。但是,有人告诉我,使用枚举可以在Java中完成更多工作,而不仅仅是创建一组可能值的命名组。

有人可以列出Java的枚举所允许的基本功能,以及一个示例,或者可能是我可以获得有关该功能的更多信息的位置吗?

非常感谢, 黑菜

编辑: 正如所建议的那样,这个问题应该是在Java中枚举和类之间存在哪些差异。我不知道他们那么强大吗?那么有什么不同?

3 个答案:

答案 0 :(得分:4)

Java的enum基本上是一个成熟的类。

您可以:

  • 声明方法和字段
  • 实施接口

但你不能:

  • 扩展类(因为enum已经隐式扩展java.lang.Enum而Java只支持单实现继承)。
  • 有公共建设者

他们有:

  • 一些编译器生成的方法,如valueOfvalues
  • 一些额外的线程安全保证(单项枚举是在Java中实现单例的推荐方法)

答案 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();
    }
}

希望你觉得它很有用。