仅仅为了可读性,将不可变对象中的变量定义为final?

时间:2017-07-22 21:01:50

标签: java immutability final

在不可变对象中,将变量设为私有将限制外部世界的访问。变量最终需要什么?原因只是让它可读吗?如果变量是最终的,那意味着对象是不可变的?它背后有任何理论上的原因吗?

2 个答案:

答案 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具有相同的好处。它们都确保不会意外更改保持不变的值。它更多的是避免错误"而不是"提高可读性"。