列挙型値().lengthとプライベートフィールドの比較 質問する

列挙型値().lengthとプライベートフィールドの比較 質問する

次のような列挙があります:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }
}

列挙型にフィールドがいくつあるか確認する必要がある場合があります。最適な解決策は何でしょうか? メソッド「values().length」を使用する必要がありますか? または、次のように列挙型に定数フィールドを作成する必要があります。

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }

    public static final int Size = 5;
}

最も速く、よりエレガントな解決策は何でしょうか?

ベストアンサー1

を使用するとvalues().length、呼び出すたびに配列の新しいコピーが作成されます。私はListこの無意味なコピーを避けるために、独自のコピー(またはセット、マップなど)を作成することがあります。しないだろうただし、ハードコードする必要があります...サイズだけが必要な場合は、次のようにします:

private static final int size = Configuration.values().length;

最後に、これが評価されるまでに、すべての値が初期化されます。これにより、他の回答で提起された DRY と不整合の懸念を回避できます。

もちろん、これはそれ自体がちょっとしたマイクロ最適化ですが、最終的にはよりシンプル結局のところ、コードです。values().length他の場所から呼び出すことは、あなたが興味を持っていることを表現しません。ただ列挙型のサイズ - 値の配列を通じてそれを取得するという事実は、偶発的で気が散るものであると私は思います。

を使用する代わりに、小さな列挙型に whichvalues()を使用するとEnumSet.allOf().size()コストがかなり低くなりますが、この場合も、フィールドだけを持つ場合ほど読みやすくはありませんsize

おすすめ記事