gpt4 book ai didi

java - 为 enum-s 提供通用数据的更好方法

转载 作者:行者123 更新时间:2023-11-29 05:36:08 25 4
gpt4 key购买 nike

假设,我想要一个 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 和共享值。

这个问题可以通过将静态数组放在一个单独的类中来解决:

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;
}
}

但这看起来更像是一个尴尬的补丁,而不是一个合乎逻辑的解决方案。

是否有不允许在枚举初始化器中引用静态类的原因?

最佳答案

It there a reason for not allowing a reference to a static class within enum initializer?

这是一个不允许您访问的静态字段,并且有一个很好的理由:该字段仍将具有其初始值,因为枚举成员将在之前被初始化 任何后来的静态字段初始值设定项。如果您尝试填充由枚举的某些方面作为键值的 map ,这通常是一个问题 - 您真的很想在构造函数中执行填充,但您不能这样做,因为 map 尚未创建。

选项:

  • 在静态初始化程序 block 中执行所有 values 初始化,该初始化程序 block 在所有实例构建完成后执行。这里的问题是,如果您希望该字段是最终的,您需要先创建数组,这意味着知道它有多大,而无需访问数据。 (请注意,鉴于 values() 方法在这里也可用,您在这里选择的名称很遗憾。)
  • 使用私有(private)嵌套类作为静态字段初始化的“持有者”。这就像您的第二个解决方案,但没有公开类(class)。

老实说,后一种方法可能是最简单的。

public enum SampleEnum {
...

private static class SampleEnumData {
static final int[] SHARED_VALUES = {1, 2, 3, 4, 5};
}
}

关于java - 为 enum-s 提供通用数据的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19487230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com