用Java中的类替换枚举构造仍然相关吗?

时间:2013-05-23 14:15:12

标签: java enums

我正在阅读由Joshua Bloch于2008年出版的有效Java,其中一个技巧是用类替换枚举结构。这是本书中显示的例子。

public class Suit {
    private final String name;
    public Suit(String name) { this.name = name; }
    public String toString() { return name; }
    public static final Suit CLUBS = new Suit("clubs");
    public static final Suit DIAMONDS = new Suit("diamonds");
    public static final Suit HEARTS = new Suit("hearts");
    public static final Suit SPADES = new Suit("spades");
}

我的问题是,由于Java现在支持枚举类型,使用上述方法仍然是一个好主意吗?这是Java枚举类型的示例。

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

3 个答案:

答案 0 :(得分:11)

" Effective Java"在将enum引入语言之前,本书已经写好了,因此我建议使用enum功能。幸运的是,Java enum非常通用,因此您可以使用enum功能非常密切地遵循Joshua的建议:

public enum Day {
    SUNDAY("Sunday", 0)
,   MONDAY("Monday", 1)
,   TUESDAY("Tuesday", 2)
,   WEDNESDAY("Wednesday", 3)
,   THURSDAY("Thursday", 4)
,   FRIDAY("Friday", 5)
,   SATURDAY("Saturday", 6);

    private String name;
    private int ordinal;
    public String getName() { return name; }
    public int getOrdinal() { return ordinal; }
    public Day(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
}

答案 1 :(得分:2)

我认为这个想法正好相反。如果你有类似枚举的结构 - 请使用enum

您的类示例并不完全适合您编写的枚举。首先,它无法编译,因为它包含多个名为CLUBS的字段。其次,枚举包含您班级中未提及的日期。

答案 2 :(得分:0)

据我所知,java将enum-s编译为public static final个对象。 您可以通过使用javaphttp://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html)查看枚举.class文件来检查此内容。