0

私はJava4を使用しています。少し前に、パブリッククラスで次のように宣言された変数に出くわしました。

final private static Set name = new HashSet(){
  {
     add(object1); 
     ...; 
     add(objectN);
  }
};

状況によっては、実行時にオブジェクトを追加(または削除)する必要がありました。

このクラスには、オブジェクトを追加または削除する前に呼び出されたパブリックコンストラクターがありました。

最終変数は定数として扱われるため、実行時に.add(object)メソッドと.remove(object)メソッドを呼び出すことができないと思いました。しかし、とにかくそれを行いました。追加と削除の操作を実行するための2つのパブリックメソッドを作成し、それが機能しました。

なんで?コンパイルしないか、実行時に何らかの例外をスローすることを期待していました。

誰かが説明できますか?

どうもありがとうございます、

よろしくお願いします

4

3 に答える 3

3

変数への参照nameは基本的に定数であり、変更することはできません。ただし、セットの内容は、発見したとおり、実行時に変更される可能性があります。それを防ぐために、あなたはそれを不変にすることができます、例えば

final private static Set name = Collections.unmodifiableSet(new HashSet(){
    {
        add(object1); 
        ...; 
        add(objectN);
    }
});
于 2012-11-16T19:45:32.357 に答える
2

最終変数の参照を変更することはできませんが、状態を変更することはできます。

例えば:

次のように参照を変更することはできませんname = new HashSet();

于 2012-11-16T19:41:05.703 に答える
1

最終変数は、それらが属するクラスのコンストラクターが実行された後は、新しい参照を割り当てることができません。ただし、メソッドを呼び出すことで、内部状態を確実に変更できます。

于 2012-11-16T19:41:48.863 に答える