假設我想要一個int []數組被所有枚舉實例共享。下面是一個例子爲枚舉提供公共數據的更好方法
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;
}
}
但這看起來更作爲彆扭貼片,不是邏輯溶液。
有沒有在枚舉初始值設定項中引用靜態類的原因?
構造在靜態字段全部被初始化之前調用,請參閱http://stackoverflow.com/questions/443980/why-cant-enums-constructor-access-static-fields/444000#444000 – BlackJoker
謝謝J.Rush。據我所知,所有類都是這種情況,不僅僅是枚舉。元素的第一個實例化會觸發靜態構造函數並初始化所有靜態字段。爲什麼枚舉有一個特殊的限制? – cyanide