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

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

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

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

不。 static意味着它在类的所有实例中都是相同的。 final意味着它在初始分配后不可转让。 因此,两个实例可能具有非静态最终变量的不同值。

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

我想你正在考虑简单的案例,例如:

  private final int num = 3; 

这可以更好地写为:

  private static final int NUM = 3; 

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

  private final List children = new ArrayList(); 

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

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

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

两个原因:

1)从类设计的角度来看,它允许程序员依赖于自实例化以来字段不会改变的事实 – 所谓的“ 不可变对象 ”。 Java教程说:

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

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

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

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

它可以防止其他程序员做出他们不应该尝试做的愚蠢事情……