次のような列挙があります:
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
。