为什么不声明一个数组最终使它在Java中不可变?

nay*_*yef 15 java final immutability

为什么不声明一个数组最终使它在Java中不可变?不宣称最终意味着它无法改变?

与不可变数组相关的问题中可以清楚地看出,声明一个数组final并不会使它不可更改.

以下是可能的.

final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
Run Code Online (Sandbox Code Playgroud)

我的问题是:那么在这里宣布决赛的功能是什么?

Mar*_*nik 33

final只是关于它标记的参考 ; 在Java中没有不可变数组这样的东西.当你说

private final int[] xs = new int[20];
Run Code Online (Sandbox Code Playgroud)

你不会被允许说

xs = new int[10];
Run Code Online (Sandbox Code Playgroud)

稍后的.这就是所有的东西final是什么.更一般地,确保对象是不可变的通常是艰苦的工作并且充满了一系列细微之处.开箱即用的语言本身并没有给出太多结果.

  • 但是,有不可变的集合。([[`Collections.emptyList()`](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#emptyList%28%29)和[`Collections.unmodifiableList( List <?扩展T>)`)`](例如,例如http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableList%28java.util.List%29)) (2认同)
  • @Grundlefleck不需要JCIP,你可以[从马的嘴里]得到它(http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5).当然,这些语义只有在你没有从构造函数中泄漏那个字段或`this`时才有效,如果你修改了数组(包括修改它的一个对象,如果它是一个引用类型的数组),那么构造函数之后返回,所有投注都关闭. (2认同)

Boh*_*ian 8

final意味着您无法更改引用 - 即您无法将另一个数组分配给该字段.

"不可变"意味着你不能改变数组的内容 - final对此没有影响.

如您的代码所示,您可以为数组的其中一个元素赋值,这不会更改对数组的引用