Synapse
が抽象型であるクラス内に次のステートメントがある場合:
private final List<Synapse> synapses;
内のオブジェクトfinal
の状態を変更することはできますが、リストに新しいオブジェクトを追加することはできませんか?私が間違っている場合は、何をしているのか、代わりにキーワードをいつ使用すべきかを説明してください。Synapse
List
Synapse
final
final
いいえ、finalキーワードは、リストまたはその内容を不変にしません。不変のリストが必要な場合は、次を使用する必要があります。
List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses);
最後のキーワードは、「synapses」変数に新しい値を割り当てられないようにすることです。つまり、次のように書くことはできません。
final List<Synapse> synapses = createList();
synapses = createNewList();
ただし、次のように書くことができます。
List<Synapse> synapses = createList();
synapses = createNewList();
本質的には、リストの内容を変更、追加、削除することはできますが、可変シナプスに割り当てられた新しいリストを作成することはできません。
final
一度割り当てた後で再割り当て できないようにsynapses
します。通常どおりに要素を追加/削除できます。final
キーワードについて詳しくは、こちらをご覧ください。
リストの内容を変更、追加、および削除することはできますが、変数に割り当てられた新しいリストを作成することはできません。
Java言語仕様は次のように書いています。
変数はfinalとして宣言できます。最終変数は1回だけ割り当てることができます。変数finalを宣言することは、その値が変更されないことを示す有用なドキュメントとして役立ち、プログラミングエラーを回避するのに役立ちます。
最終変数が割り当てられる直前に確実に割り当て解除されていない場合(§16)を除いて、最後の変数が割り当てられている場合は、コンパイル時エラーになります。
空白のfinalは、宣言に初期化子がないfinal変数です。
最終変数が割り当てられると、常に同じ値が含まれます。最終変数がオブジェクトへの参照を保持している場合、オブジェクトの状態はオブジェクトの操作によって変更される可能性がありますが、変数は常に同じオブジェクトを参照します。
したがって、変数を介して到達可能な状態が変更されないようにする場合は、変数を宣言しfinal
、変更不可能なリスト(たとえば、Collections.unmodizableListSynapse
を使用)を使用して、オブジェクトを不変にする必要があります。
最終的な実装では、オブジェクト参照が開始されると、参照自体は変更できませんが、コンテンツは変更できます。ルールにまったく違反していません。それに応じて機能する参照変更に関するルールを1つだけ指定しました。値も決して変更しないようにしたい場合は、不変のリストを選択する必要があります。
List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
次の関連する質問を参照してください。
上記の回答はすべて理論的にここで説明されており、実行するコードを見つけて実際の差異を確認できます。loacal変数を使用することをお勧めします
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)