2009-04-13 2 views
4

は最近、私はつまり、私のような何かをしたい、私は事前1.5 Javaで似た何かをしたいこれらのEnumSetの?

enum Thing { 

    /* etc etc */ 

    static final Set<Thing> allThings = EnumSet.allOf(Thing.class); 

} 

をたくさん行ってきた:

final class Thing { 

    private Thing(); // control instances within class 

    static final Thing instance0 = new Thing(); 
    static final Thing instance1 = new Thing(); 

    static final Set allThings = // ????? 
} 

私はこれをどのようにしたらよいでしょうか?

+1

てきた事のコンストラクタは、静的なセットallThingsに自分自身を追加します。 –

答えて

4

何:

final class Thing { 

    static final Set allThings = new HashSet(); 

    private Thing() { 
     allThings.add(this); 
    } // control instances within class 

    static final Thing instance0 = new Thing(); 
    static final Thing instance1 = new Thing(); 
} 
3

前1.5のJavaには直接相当するものはありませんでした。あなたはすぐに初期化したい場合は、Java 1.5の前に

は、2つ(構文的に風変わりな)のオプションがありました:

static final Set allThings = new HashSet(Arrays.asList(new Object[] { 
    instance0, instance1, // etc. 
})); 

または

static final Set allThings = new HashSet() {{ 
    add(instance0); 
    add(instance1); 
    // etc. 
}}; 

は、これらのいずれもかかわらず、自分の欠点を有しています。簡単な方法は、単に静的メソッドを作るために

private static Set all() { 
    Set ret = new HashSet(); 
    ret.add(instance0); 
    ret.add(instance1); 
    // etc. 
} 

であるあなたはまだ方法に新しいメンバーを追加することを忘れないように持っているが、それは(ほとんどの人にとって)読みやすいです。そのことについて

1

前JAV 5環境でタイプセーフな列挙型を定義する方法のかなり明確に定義されたパターンがあります。

それは基本的にpublic final static値のフィールドとプライベートコンストラクタ(またはそれ以上)を持つクラスです。

のみ「ハード」なことは、(readResolve()を実装することにより、基本的には)直列化権などの詳細情報を取得しています。

This Javaworld Tipはかなり深く問題になり、this oneにはもう少し話題があります。

0

各列挙型クラスは、抽象基本クラスAbstractEnumを拡張し、すべての値の独自のセットを自動的に生成し、基本クラスの静的マップに格納します。

スレッドセーフティやシリアル化(sauaの投稿に記載されているように)のような重要な機能がまだ必要です。

関連する問題