2013-05-23 12 views
9

私は2008年に発行されたJoshua Blochによって書かれたEffective Javaを読んでいます.1つのヒントはenum構造体をクラスに置き換えることです。この本からの例を示します。enum構造体を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がenum型をサポートしているので、上記の方法を使用するのはまだ良いアイデアですか? Javaの列挙型の例を次に示します。

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

Javaのenumはクラスです。 – FDinoff

+0

基本的なenumのような機能のために、単純な 'enum'を使わない理由はありません。型安全な列挙型パターンをまだ適用できる列挙型ではできない、少し高度な改良があります。 –

+0

本書の第2版を読むと、それは本当に価値がある。新しいJavaの機能をカバーするからだ。 –

答えて

10

「効果的なJavaの」本は言語にenum Sの導入前によく書かれているので、私が代わりにenum機能を使用することをお勧めします。私はアイデアはまったく逆だと思い

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; 
    } 
} 
+0

EnumSetsも非常に便利な構造です。 – wmorrison365

+6

第2版では列挙型の使用をカバーしていることは注目に値する。 – Jonathan

+0

dasblinkenlightありがとう、あなたの例は非常に便利です。 – beyonddc

2

:あなたはenum機能を使用して、かなり密接にジョシュアのアドバイスに従うことができるように幸いなことに、Javaのenum sが、非常に汎用性があります。列挙型の構造の場合は、enumを使用してください。

あなたのクラスの例は、あなたが書いた列挙型に正確に適合しません。まず、CLUBSという名前のフィールドがいくつか含まれているため、コンパイルできません。次に、enumには、クラスに記載されていない日が含まれます。

+0

おっと!あなたは私のタイプミスをキャッチしました。 – beyonddc

0

私が知る限り、javaはenum-sをpublic static finalオブジェクトにコンパイルします。 enum .classファイルをjavaphttp://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html)と表示して確認できます。

+0

それは正しいですが、それは本当に質問に答えるものではありません。 –

+0

これは両方のアプローチが同等であることを示しています。 – mrak

+0

ソースコードが重要でない場合にのみ、ソースが非常に重要であると言えます。 –

関連する問題