final
关键字如何使变量不可变? Wikipedia says it doesn't.
答案 0 :(得分:31)
在Java中,术语 final 指的是引用,而 immutable 指的是对象。将final
修饰符分配给引用意味着它不能更改为指向另一个对象,但如果对象本身是可变的,则可以对其进行修改。
例如:
final ArrayList<String> arr = new ArrayList<String>();
arr.add("hello"); // OK, the object to which arr points is mutated
arr = null; // Not OK, the reference is final and cannot be reassigned to
正如维基百科的文章所提到的,如果你来自C ++,你必须将const
的概念分离为final
并且不可变。
答案 1 :(得分:3)
虽然不推荐使用,但Java允许使用reflection修改最终变量。
答案 2 :(得分:1)
假设您已声明myList是final。您仍然可以向myList添加新项,因此其状态不是不可变的。由于final关键字,您不能做的是更改myList以引用其他列表。
答案 3 :(得分:1)
阅读维基百科文章的其余部分:
说明终极性没有 保证不变性:假设我们 替换三个位置变量 只用一个: 公共最终位置pos;其中pos是具有三个属性的对象 pos.x,pos.y和pos.z.然后pos 无法分配,但三者 属性可以,除非它们是最终的 自己。
答案 4 :(得分:0)
因为如果引用是最终的,您仍然可以更改引用所指向的对象中的内容。你不能改变参考。
答案 5 :(得分:0)
对于诸如int, double, char
之类的原语,它可以更像你期望的那样工作。
private final int status = 10;
status = 20; // WONT COMPILE because status is final