在不可变对象中,将变量设为私有将限制外部世界的访问。变量最终需要什么?原因只是让它可读吗?如果变量是最终的,那意味着对象是不可变的?它背后有任何理论上的原因吗?
答案 0 :(得分:0)
您不会将变量标记为final,而是将变量标记为变量。它根本不保证不变性。它只是保证一旦分配的最终引用不能重新分配+给你线程安全保证。
考虑这样的例子:
class A {
private int someVariable = 5;
public void setSomeVariable(int someVariable) {
this.someVariable = someVariable;
}
class B {
private final A a;
public B(A a) {
this.a = a;
}
}
public class C {
public static void main(String[] args) {
A someA = new A();
B someB = new B(someA);
//field a in B is final but I can do this:
someA.setSomeVariable(6); // by having a reference to someA I have modified someB though it is a final field
}
答案 1 :(得分:0)
你似乎对你的理解有一些误解。让我们一个接一个地看看它们。
如果变量是final,则意味着对象是不可变的
这是不对的。不可变性和标记为final
的东西是完全不同的概念。
一旦创建对象,Immutability使对象的属性(字段)不可更改。另一方面,final
变量是您无法在第一次分配后更改其值的内容。
让我们考虑一下这个不可变对象的类:
class MyClass {
private int myField;
public int getMyField() { return myField; }
public MyClass(int myField) { this.myField = myField; }
}
如您所见,myField
在初始化时无法更改。除了构造函数之外,它不能在代码的任何部分中更改。让我们创建一个变量:
MyClass obj = new MyClass(10);
如我们所知,obj.myField
此时无法再更改,但obj
可以更改吗?是的,例如。
obj = null;
您可以声明final
使obj
不可更改:
final MyClass obj = null;
obj = new MyClass(10); // error!
现在你看到了最终和不变性之间的区别,让我们继续发挥两者的好处。
不变性和final
具有相同的好处。它们都确保不会意外更改保持不变的值。它更多的是避免错误"而不是"提高可读性"。