Java:是枚举数组的最终引用吗?

sco*_*ttb 4 java enums multithreading final immutability

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

枚举的唯一性和单一性由JVM强制执行,因此我认为可以说它们是不可变的.

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

但是......阵列怎么样?可能仍有可能破坏包含枚举引用的数组吗?

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

static final List<MetaData<Client>> C_COLUMNS =
        DataTables.CLIENTS.getTableColumnsAsEnums();
Run Code Online (Sandbox Code Playgroud)

其中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())); }
Run Code Online (Sandbox Code Playgroud)

我对吗?这应该成为多线程设计的一部分,所以我担心这个关键的静态数据列表会被应用程序非常容易呈现的方式...如果它实际上是可变的.

Ste*_*n C 11

但是......阵列怎么样?可能仍有可能破坏包含枚举引用的数组吗?

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

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

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

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

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