1. ホーム
  2. java

[解決済み] Javaの "final "キーワードはどのように機能するのでしょうか?(オブジェクトを修正することは可能です。)

2022-03-18 16:15:54

質問

Javaでは final キーワードを変数に使用すると、その値を変更してはいけないことを指定できます。 しかし、クラスのコンストラクタやメソッドで値を変更することができますね。繰り返しになりますが、もし変数が static の場合、コンパイルエラーになります。

以下はそのコードです。

import java.util.ArrayList;
import java.util.List;

class Test {
  private final List foo;

  public Test()
  {
      foo = new ArrayList();
      foo.add("foo"); // Modification-1
  }
  public static void main(String[] args) 
  {
      Test t = new Test();
      t.foo.add("bar"); // Modification-2
      System.out.println("print - " + t.foo);
  }
}

上記のコードは正常に動作し、エラーはありません。

ここで、変数を static :

private static final List foo;

今度はコンパイルエラーになりました。どのようにこの final は本当にうまくいくのでしょうか?

どのように解決するのですか?

を常に許可しています。 初期化 a final 変数を使用します。 コンパイラは、一度しかできないように配慮しています。

に格納されたオブジェクトのメソッドを呼び出すと、そのオブジェクトのメソッドを呼び出すことができないことに注意してください。 final のセマンティクスとは何の関係もありません。 final . 言い換えれば final は、あくまでも参照そのものについてであり、参照されたオブジェクトの内容については関係ありません。

Javaにはオブジェクトの不変性という概念はありません。不変性を実現するには、オブジェクトを慎重に設計する必要があり、それは決して簡単なことではありません。