4

我认为对枚举数组的最终引用应该是不可变的。

枚举的唯一性和奇异性是由 JVM 强制执行的,所以我相信可以肯定地说它们是不可变的。

最终引用不能更改,因此该引用是不可变的。

但是......阵列呢?是否仍有可能颠覆包含枚举引用的数组?

我有一个对应于数据库列的枚举列表。这些列名及其相关数据不会改变,所以......我希望将列表作为类变量,如下所示:

static final List<MetaData<Client>> C_COLUMNS =
        DataTables.CLIENTS.getTableColumnsAsEnums();

其中 CLIENTS 是为其生成列枚举列表的 DataTable 枚举。执行此操作的方法如下:

public <T extends DB> List<MetaData<T>> getTableColumnsAsEnums() {
    Class<? extends MetaData> cls = this.columnsEnumToken();
    return new ArrayList(Arrays.<MetaData<T>>asList(cls.getEnumConstants())); }

我对吗?这应该成为多线程设计的一部分,因此我担心制作这个关键的静态数据列表会使应用程序变得非常脆弱……如果它实际上是可变的。

4

3 回答 3

11

但是......阵列呢?是否仍有可能颠覆包含枚举引用的数组?

是的。Java 中的所有数组都是可变的,无论您如何声明保存对数组的引用的变量。

如果你想避免这种“风险”,那么你一定不能暴露数组;即您需要将其声明为private. 然后,您可以执行以下一项(或多项)操作:

  • 定义将创建并返回数组副本的静态方法。(这里可能不是最好的选择......)

  • 定义一个get(int)返回数组第 i 个元素的静态方法。

  • 将数组包装在一个列表中(使用Arrays.asList)并为其创建一个不可修改的包装器(使用Collections.unmodifiableList)。

于 2013-06-18T04:38:06.370 回答
4

如果您想public <T extends DB> List<MetaData<T>> getTableColumnsAsEnums()返回一个不可变的列表,您需要使用Collections.unmodifiableList()

此外,当您使用不可修改的列表时,您不必担心内部数组,因为该toArray方法将返回内部数组的副本,而不是对内部数组本身的引用。这适用于所有集合。

于 2013-06-18T04:38:21.400 回答
2

REFERENCE 是不可变的,该引用的内容不是,这就是事情的工作方式。
所以以下将不起作用

public enum TheEnum {
//......
}

final TheEnum[] arr = new TheEnum[5];
var = new TheEnum[6];

但这会起作用

public enum TheEnum {
  OPTION_ONE;
//......
}

final TheEnum[] arr = new TheEnum[5];
var[1] = TheEnum.OPTION_ONE;
于 2013-06-18T05:23:22.543 回答