2015-03-19 160 views
0

如果有一個枚舉,的Java:類等效枚舉

public enum Animal { 
    DOG, 
    CAT; 
} 

如果我理解正確枚舉,我們可以把他們在等價類,像 -

public class Animal { 
    private static final DOG = 1; 
    private static final CAT = 2; 
} 

是這是正確的表示,還是我在這裏錯過了什麼?

謝謝。

+0

不,這不是實際的代表! [檢查此文件](http://docs.oracle.com/javase/8/docs/technotes/guides/language/enums.html) – 2015-03-19 08:11:05

+0

@NaveenRamawat,不是,請查看Pshemo答案! – 2015-03-19 08:12:54

回答

3

不,您的代碼顯示了在Java 1.5中添加enum之前如何組織物品。

  • 您的枚舉值需要爲public而不是private,因爲您希望使它們在任何地方均可訪問。
  • 此外,他們的價值是你的枚舉類的實例,而不是整數(您可能需要調用像TimeUnit.SECONDS.toMinutes(120);這些實例的一些方法,你就如SECONDS調用toMinutes

所以,你的代碼看起來更像

public class Animal extends Enum<Animal>{ 
    public static final Animal DOG = new Animal(); 
    public static final Animal CAT = new Animal(); 

    //rest of code added by compiler, like 
    // - making constructor private 
    // - handling `ordinal()` 
    // - adding `valueOf(String) ` and `values()` methods 
} 
+0

獲取編譯錯誤 - 類不能直接擴展java.lang.Enum,任何分辨率? – Prakhar 2015-03-19 08:37:30

+0

這是正確的。 Enum是隻能由編譯器通過'enum YourClass'生成的代碼才能擴展的類(它會產生'YourClass extends Enum {...}'。你無法避免它。 – Pshemo 2015-03-19 08:39:04

+0

所以你的意思是上面的類是不能編譯的,因此不能使用? – Prakhar 2015-03-19 08:44:10

5

不完全。這裏是如何將看起來像:

public class Animal extends Enum<Enum<Animal>> { 
    public static final DOG = new Animal("DOG", 0); 
    public static final CAT = new Animal("CAT", 1); 
    private static final Animal[] values = new Animal[] {DOG, CAT}; 

    private Animal(String name, int ordinal) {super(name, ordinal);} 
    public static Animal valueOf(String name) {return Enum.valueOf(Animal.class, name)} 
    public Animal[] values() {return values;} 
} 

java.lang.Enum持有ordinalname,並提供可以訪問它們的方法。

+0

您的構造函數看起來不適合您最近做出的更改。 – Prakhar 2015-03-19 08:26:58

+0

@Prakhar,謝謝。我剛修好了。 – AlexR 2015-03-19 08:45:39