将实例变量作为最终的点?

时间:2010-01-13 04:08:01

标签: java

将实例变量作为final是什么意思?

将变量设置为静态最终变量不是更好吗?

因为它不能被任何对象改变,那么它与类(静态)变量相同,对吗?

6 个答案:

答案 0 :(得分:25)

不。 static表示在所有类的实例中都是相同的。 final表示在初始分配后不可分配。因此,对于非静态最终变量,两个实例可能具有不同的值。

你可能想要做出变量最终的原因有很多;其中最好的是清晰度。如果我读了一个方法并注意到foo是最终的,我不必担心它在下面的位置 - 因为它不是;它不能。我可以对代码进行更多更改,最终变量的关注度较低(“我是否在bar之前或之后更改了foo的值,这是否重要?”)因为我知道某些变量不会发生变化。它还将我的注意力集中在 可能发生变化的变量上 - 而且它们是值得更多关注的变量。

答案 1 :(得分:4)

有两个原因:

1)从类设计视图中,它允许程序员依赖于自实例化以来字段不会改变的事实 - 所谓的“immutable object”。 Java教程说:

  

不可变对象在并发应用程序中特别有用。由于它们不能改变状态,因此它们不会被线程干扰破坏或在不一致状态下被观察到。

不可变对象是各种编程风格的基石,例如:纯函数式编程。

2)第二个原因是JVM优化。如果所有字段都是final,那么JVM知道对象的状态不能被改变,因此它可以进行许多优化,例如,省略线程安全检查等。

答案 2 :(得分:4)

我猜您正在考虑简单的案例,例如:

 private final int num = 3;

这可以更好地写成:

 private static final int NUM = 3;

但是,通常您会引用可变的对象,因此无法在类之间共享:

 private final List<Node> children = new ArrayList<Children>();

或者,也许是在构造函数中传递或派生的值:

 public final class MyThing {
      private final String name;
      public MyThing(String name) {
          this.name = name;
      }
      [...]
 }

注意:final字段可以在构造函数(或实例初始化函数)中分配,而不仅仅是声明的一部分。

答案 3 :(得分:2)

您可以为其指定一个特定于对象实例的值,而不能使用静态类变量。

答案 4 :(得分:0)

它阻止其他程序员做他们不应该尝试做的蠢事无论如何 ......

答案 5 :(得分:0)

class A{
    public final int x;

    A(int arg){
        x = arg;  // This is legal  !!!
    }
}

public class HelloWorld{

     public static void main(String []args){
         A  a = new A(1);
         A  b = new A(2);
         System.out.printf("a.x = %d, b.x = %d", a.x, b.x);
     }
}