Java:对枚举数组的最终引用是不可变的吗?

Java:对枚举数组的最终引用是不可变的吗?,java,multithreading,enums,immutability,final,Java,Multithreading,Enums,Immutability,Final,我认为对枚举数组的最终引用应该是不可变的 枚举的唯一性和奇异性是由JVM强制实现的,因此我相信可以肯定地说它们是不可变的 无法更改最终引用,因此该引用是不可变的 但是。。。阵列呢?是否仍有可能破坏包含枚举引用的数组 我有一个对应于数据库列的枚举列表。这些列名及其关联数据不会更改,因此。。。我希望列表作为类变量,如下所示: static final List<MetaData<Client>> C_COLUMNS = DataTables.CLIENTS.g

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

枚举的唯一性和奇异性是由JVM强制实现的,因此我相信可以肯定地说它们是不可变的

无法更改最终引用,因此该引用是不可变的

但是。。。阵列呢?是否仍有可能破坏包含枚举引用的数组

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

static final List<MetaData<Client>> C_COLUMNS =
        DataTables.CLIENTS.getTableColumnsAsEnums();
静态最终列表C_列=
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())); }
public List getTableColumnsAsEnums(){
等级
但是…数组呢?是否仍有可能破坏包含枚举引用的数组

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

如果要避免此“风险”,则不得公开阵列;即,需要将其声明为
private
。然后可以执行以下一项(或多项)操作:

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

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

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


如果要让
公共列表getTableColumnsAsEnums()
返回不可变列表,则需要使用
集合。不可修改列表()


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

引用是不可变的,该引用的内容不是,这只是h事情是如何运作的。
所以下面的方法行不通

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;