Synapse
が抽象型であるクラス内に次のステートメントがある場合:
private final List<Synapse> synapses;
final
を使用すると、Synapse
内のList
オブジェクトの状態を変更できますが、新しいSynapse
オブジェクトをに追加することはできません。リスト?私が間違っている場合は、final
の機能と、代わりにキーワードfinal
を使用する必要がある場合について説明してください。
いいえ、finalキーワードはリストまたはその内容を不変にしません。不変のリストが必要な場合は、以下を使用する必要があります。
List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses);
最後のキーワードは、「シナプス」変数に新しい値を割り当てられないようにすることです。つまり、次のように書くことはできません。
final List<Synapse> synapses = createList();
synapses = createNewList();
ただし、次のように書くことができます。
List<Synapse> synapses = createList();
synapses = createNewList();
final
は、一度割り当てた後、再割り当てsynapses
を防止します-要素を次のように追加/削除できますあなたは通常そうするでしょう。 final
キーワードの詳細については here を参照してください。
Java言語仕様 書き込み :
変数はfinalとして宣言できます。最終変数は1回だけ割り当てることができます。変数finalを宣言すると、その値が変更されないことを示す有用なドキュメントとして役立ち、プログラミングエラーを回避するのに役立ちます。
割り当ての直前に明確に割り当てられていない(§16)場合を除き、最終変数が割り当てられていると、コンパイル時エラーになります。
空白のfinalは、宣言に初期化子がない最後の変数です。
最終変数が割り当てられると、常に同じ値が含まれます。最終変数がオブジェクトへの参照を保持している場合、オブジェクトの状態はオブジェクトの操作によって変更される可能性がありますが、変数は常に同じオブジェクトを参照します。
したがって、変数を介して到達可能な状態が変更されないようにする場合は、変数final
を宣言し、変更不可能なリストを使用する必要があります(たとえば、 Collections.unmodizableList ) 、およびSynapse
オブジェクトを不変にします。
リストの内容を変更、追加、削除することはできますが、変数に割り当てられた新しいリストを作成することはできません。
最終的な実装では、オブジェクト参照が開始されると、参照自体は変更できませんが、コンテンツは変更できます。ルールにまったく違反していません。それに応じて機能する参照変更に関するルールを1つだけ指定しました。値も決して変更しないようにしたい場合は、不変のリストを選択する必要があります。
List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
次の関連質問を参照してください。
上記の回答はすべて理論的にここで説明されており、実行するコードを見つけて実際の違いを確認できます。ローカル変数を使用することをお勧めします
package exp_test;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.List;
public class testList {
final static List<String> synapses = new ArrayList();;
public static void main(String[] args) {
synapses.add("A");
System.out.println(synapses);
//
System.out.println(finalLisTest(synapses));
//
System.out.println(synapses);
//
synapses.add("B");
List<String> unmodifiableList = Collections.unmodifiableList(synapses);
System.out.println(finalLisTest(unmodifiableList));
//
System.out.println(unmodifiableList);
}
private static List finalLisTest(List<String> list) {
list.remove(0);
return null;
}
}
結果 :
[A]
null
[]
Exception in thread "main" Java.lang.UnsupportedOperationException
at Java.util.Collections$UnmodifiableList.remove(Collections.Java:1317)
at exp_test.testList.finalLisTest(testList.Java:29)
at exp_test.testList.main(testList.Java:22)