2015-03-19 110 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