如何使用java.lang.Enum

时间:2009-12-07 09:47:28

标签: java

这不是enum中新功能的问题。 这不是一个等待答案的问题 枚举相当于类xyz扩展Enum。如果您希望宣传如何使用枚举,请参阅众多教程,请不要回答。

这个问题具体是关于如何使用java.lang.Enum类。 相反,java.lang.Enum不能直接扩展也不能实例化,对吧? 确实,java.lang.Enum只是为了枚举类型而没有其他权利吗?

如果是这样,变色是没有意义的,对吧?即使编译器允许它。

final static Enum<colors> colours = null;
enum colors {"R","G","B"};

那么,除了null之外,还有什么可能等同于变量颜色。

当然,编译器不允许我这样做

class BaseColour extends Enum<BaseColour>{ ,,,}

但它允许enum成为一个不公平的优势,能够将其作为编译器的幕后操作。

我问这个问题,因为我希望做这样的事情

class Reddish extends BaseColour {"Crimson", "Blood", "Pink"};
class Purplish extends BaseColour {"Violet", "Evening Sky", "Brinjal"};
class Greenish extends BaseColour {"Algae", "Leaf"};

我希望将这些中的任何一个,以及任何这些枚举类型传递给方法

void squeezeColour(BaseColour colourConstraint)
{ ... }

有可能吗? / **如果没有,如果您恰好是James Gosling等人,您是否会考虑将其用于下一版本的Java规范? ** /

进一步提问:我忘记说这个...... 我正在研究的是使用EnumMap或EnumSet并利用contains和range方法。这是我能做的最好的吗?

3 个答案:

答案 0 :(得分:1)

如果你想这样做,你必须自己做,不使用枚举。如果你谷歌旧的“类型安全枚举”模式,你会找到一个合理的方式。

这是因为Enum类中的方法,例如values()和ordinal()。

如果你可以通过扩展来添加值,那么它们应该如何在基类的values()方法中结束。如果你不想在基本枚举的values()方法中使用它们,那么它会破坏以下规则:

X instanceof MyEnum =&gt; MyEnum.values()包含X

Reddish.ordinal()应该不同意BaseColour.ordinal()或同意。这应该是怎么回事。它可以解决(正如C ++调度表所示),但几乎肯定不值得付出努力。

答案 1 :(得分:1)

您可以使用Dictionary将抽象外观(红色)映射到Enum。这样你就可以保留Enum,你可以使用字典方法对它进行比较。

答案 2 :(得分:-2)

内部实际上是一个整数常量。或者至少,JVM可以自由地将其视为一个,正是因为这种限制让您感到沮丧。这使得枚举变得高效,但却以打破面向对象为代价。

我建议您恢复枚举语法之前使用的旧“类型检查枚举”模式。

class Foo {

  // the constants
  public static final Foo RHUBARB = new Foo();
  public static final Foo CUSTARD = new Foo();

  // only this class and subclasses can create constants
  protected Foo(){ }
}