[英]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.