int[] 配列を enum のすべてのインスタンスで共有したいとします。ここに例があります
public enum SampleEnum {
Enum1(1), Enum2(2), Enum3(3), Enum4(4);
private int[] values;
private static final int[] SharedValues = {1, 2, 3, 4, 5};
private static final int ValueCount = SharedValues.length;
private SampleEnum(int factor) {
// I prefer to calculate data once within constructor
values = new int[ValueCount];
for (int i=0; i<ValueCount; i++)
values[i] = SharedValues[i] * factor;
}
private int[] getValues() {
return values;
}
}
推測: ValueCount と SharedValues の両方について、「初期化子内の静的列挙型フィールドを参照できません」というメッセージが表示されます。
この問題は、静的配列を別のクラスに配置することで解決できます。
class SampleEnumData {
static final int[] SharedValues = {1, 2, 3, 4, 5};
}
public enum SampleEnum {
Enum1(1), Enum2(2), Enum3(3), Enum4(4);
private int[] values;
private SampleEnum(int factor) {
// I prefer to calculate data once within constructor
int[] sharedValues = SampleEnumData.SharedValues;
int valueCount = sharedValues.length;
values = new int[valueCount];
for (int i=0; i<valueCount; i++)
values[i] = sharedValues[i] * factor;
}
private int[] getValues() {
return values;
}
}
しかし、これは論理的な解決策というよりも、ぎこちないパッチのように見えます。
列挙型初期化子内で静的クラスへの参照を許可しない理由はありますか?