簡體   English   中英

如何使用java.lang.Enum

[英]How to use java.lang.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並利用包含和范圍方法。 這是我能做的最好的嗎?

如果你想這樣做,你必須自己做,不使用枚舉。 如果你谷歌舊的“類型安全枚舉”模式,你會找到一個合理的方法。

這是因為Enum類中的方法,例如values()和ordinal()。

如果你可以通過擴展來添加值,那么它們應該如何在基類的values()方法中結束。 如果你不想在基本枚舉的values()方法中使用它們,那么它會破壞以下規則:

X instanceof MyEnum => MyEnum.values()包含X.

如果Reddish.ordinal()不同意BaseColour.ordinal()或同意。 這應該是怎么回事。 它可以解決(正如C ++調度表所示),但幾乎肯定不值得付出努力。

您可以使用Dictionary將抽象外觀(紅色)映射到Enum。 這樣你就可以保留Enum,你可以使用字典方法對它進行比較。

內部實際上是一個整數常量。 或者至少,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(){ }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM