列挙型要素を常に宣言して初期化する必要があるため、Javaで列挙型要素を初期化する前に静的初期化を行うことはできません。列挙型要素の前の静的初期化
静的初期化がenum要素に依存しない場合、要素の後の実行順序は問題になりません。それ以外の場合、初期化がenum要素に依存する場合、これは問題を引き起こします。しかし、Java enumsはこの依存関係を満たすことができるvalues()メソッドを提供します。ただし、values()メソッドは毎回内部の静的配列をコピーするため、values()を呼び出すことはオーバーヘッドになる可能性があります。例えば
(ポストWhy can't enum's constructor access static fields?で編集):
例に見られるようにpublic enum Day {
SUNDAY("Sun"), MONDAY("Mon"), TUESDAY("Tue"), WEDNESDAY("Wed"), THURSDAY("Thu"), FRIDAY("Fri"), SATURDAY("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
static
{
for(Day day:values())
ABBREV_MAP.put(day.abbreviation, day);
}
private Day(String abbreviation) {
this.abbreviation = abbreviation;
//ABBREV_MAP.put(abbreviation, this); this is not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
、iは静的初期化コードブロックを必要としない、私があった場合従って、コピーを行う()メソッドの値を呼び出しますenum要素の前にHashMapを初期化することができます。コンストラクターでコメントアウトされたコードで十分です。
私の質問は、enum要素の初期化の義務が最初に不必要なオーバーヘッドで終わることがあるため、このオーバーヘッドを排除することが可能かどうか、つまりenum要素の前に静的初期化を行うことが可能ですか?そうでない場合は、コードの読みやすさだけですか?私はenum要素を宣言することは、いくつかの答えに記載されている安全な初期化とは何も関係がないと仮定します。
この質問では、ほとんどの時間がそれほどではありませんが、少なくともそれは深い理解と多分ブレーンストーミングの価値があります。精神的なヨガとして
この「オーバーヘッド」はほんのわずかです**マイクロ秒(おそらくそれ以下)であり、プログラムで1回しか実行されません。私はあなたのコードでパフォーマンスチューニングのためのより良い候補があると確信しています。 – assylias
私は、それがとても簡単なのに、偉大なプログラミング言語から期待どおりに完璧ではないのはなぜですか?それとも、コードの読みやすさだけですか? – oak
詳細を提供しているように見えるので、[質問の回答](http://stackoverflow.com/q/443980/135078)をチェックしてください。あなたの質問に十分かどうかわからないので、私は再投票する投票。 –