web-dev-qa-db-ja.com

最後のキーワードでリストフィールドを宣言する

Synapseが抽象型であるクラス内に次のステートメントがある場合:

private final List<Synapse> synapses;

finalを使用すると、Synapse内のListオブジェクトの状態を変更できますが、新しいSynapseオブジェクトをに追加することはできません。リスト?私が間違っている場合は、finalの機能と、代わりにキーワードfinalを使用する必要がある場合について説明してください。

18
Q Zhao-Liu

いいえ、finalキーワードはリストまたはその内容を不変にしません。不変のリストが必要な場合は、以下を使用する必要があります。

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses);

最後のキーワードは、「シナプス」変数に新しい値を割り当てられないようにすることです。つまり、次のように書くことはできません。

final List<Synapse> synapses = createList();
synapses = createNewList();

ただし、次のように書くことができます。

List<Synapse> synapses = createList();
synapses = createNewList();
31
Mark P.

finalは、一度割り当てた後、再割り当てsynapsesを防止します-要素を次のように追加/削除できますあなたは通常そうするでしょう。 finalキーワードの詳細については here を参照してください。

6
arshajii

Java言語仕様 書き込み

変数はfinalとして宣言できます。最終変数は1回だけ割り当てることができます。変数finalを宣言すると、その値が変更されないことを示す有用なドキュメントとして役立ち、プログラミングエラーを回避するのに役立ちます。

割り当ての直前に明確に割り当てられていない(§16)場合を除き、最終変数が割り当てられていると、コンパイル時エラーになります。

空白のfinalは、宣言に初期化子がない最後の変数です。

最終変数が割り当てられると、常に同じ値が含まれます。最終変数がオブジェクトへの参照を保持している場合、オブジェクトの状態はオブジェクトの操作によって変更される可能性がありますが、変数は常に同じオブジェクトを参照します。

したがって、変数を介して到達可能な状態が変更されないようにする場合は、変数finalを宣言し、変更不可能なリストを使用する必要があります(たとえば、 Collections.unmodizableList ) 、およびSynapseオブジェクトを不変にします。

3
meriton

リストの内容を変更、追加、削除することはできますが、変数に割り当てられた新しいリストを作成することはできません。

2
Kevin Rubin

最終的な実装では、オブジェクト参照が開始されると、参照自体は変更できませんが、コンテンツは変更できます。ルールにまったく違反していません。それに応じて機能する参照変更に関するルールを1つだけ指定しました。値も決して変更しないようにしたい場合は、不変のリストを選択する必要があります。

List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

次の関連質問を参照してください。

1
Lion

上記の回答はすべて理論的にここで説明されており、実行するコードを見つけて実際の違いを確認できます。ローカル変数を使用することをお勧めします

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)
0
vaquar khan