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

ajs*_*sie 13 java

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

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

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

Car*_*ter 27

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

您可能希望将变量设为最终的原因有很多; 其中最好的是清晰度.如果我读了一个方法并注意到foo是最终的,我不必担心它在下面的位置变化 - 因为它不是; 它不能.我可以对代码进行更多更改,最终变量的关注度较低("我是否在bar之前或之后更改了foo的值,这是否重要?")因为我知道某些变量不会发生变化.它还侧重于这两个变量我的注意力随时更改-他们是值得更多的关注的人.

  • 不一定 - 它可以在构造函数中分配. (6认同)

Ond*_*žka 5

两个原因:

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

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

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

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

  • @Ondra - JVM *可能*(或可能不会)优化`final`字段等的事实是一个附带问题。使用 `final` 的主要动机应该是让你的代码更健壮。(并记住以下建议:微优化 Java 是一个坏主意,因为如果您不这样做,JIT 编译器可以做得更好!) (2认同)

Tom*_*ine 5

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

 private final int num = 3;
Run Code Online (Sandbox Code Playgroud)

可以更好地写成:

 private static final int NUM = 3;
Run Code Online (Sandbox Code Playgroud)

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

 private final List<Node> children = new ArrayList<Children>();
Run Code Online (Sandbox Code Playgroud)

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

 public final class MyThing {
      private final String name;
      public MyThing(String name) {
          this.name = name;
      }
      [...]
 }
Run Code Online (Sandbox Code Playgroud)

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