[英]Is it only for readability that the variables in immutable object defined as 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
}
您的理解似乎有些误解。 让我们一一介绍。
如果变量是最终变量,则表示对象是不可变的
这是不对的。 不变性和将事物标记为final
事物是完全不同的概念。
创建对象后,不变性使对象的属性(字段)不变。 另一方面, 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.myField
,但是可以更改obj
吗? 是的,它可以例如
obj = null;
您可以将其声明为final
以使obj
不可更改:
final MyClass obj = null;
obj = new MyClass(10); // error!
现在您已经看到了最终和不变性之间的区别,让我们继续介绍两者的好处。
不变性和final
具有几乎相同的好处。 它们都确保应保持不变的值不会被意外更改。 “避免错误”比“提高可读性”更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.