2017-06-18 10 views
0

static final ArrayListを定義し、変更するために他のクラスに送信しました。しかし、私の例のintのように、彼は最終的なので、2番目のクラスでのみローカルに変更する必要があります。なぜMainクラスでもそれが変更されていますか?最終静的arraylist関数で変更されました

小さなコード例:

public class Main { 

    private static final ArrayList<String> myList = new ArrayList<>(Arrays.asList("One", "Two")); 
    private static final int num = 5; 

    public static void main(String[] args) { 

     SecondClass second = new SecondClass(myList,num); 
     System.out.println("List in Main: "+myList.get(0)); 
     System.out.println("Num in Main: "+num); 
    } 
} 

public class SecondClass { 

    public SecondClass(ArrayList<String> list, int num) 
    { 
     list.set(0,"Three"); 
     num = 10; 

     System.out.println("List in second: "+list.get(0)); 
     System.out.println("Num in Second: "+num); 
    } 
} 

マイ出力:私はそれがあることが予想何

List in second: Three 
Num in Second: 10 
List in Main: Three 
Num in Main: 5 

List in second: Three 
Num in Second: 10 
List in Main: One 
Num in Main: 5 
+0

「Num in Second」は、パラメータ参照にバインドされたローカル変数であり、他のクラスによって設定された静的変数ではありません。一方、リストはオブジェクト参照であり、同じです –

+1

練習として、 'SecondClass(ArrayList list、final Integer num)'を試してください。 –

答えて

3

myListは不変です。それが指し示すオブジェクトはそうではありません。リストの内容を不変にするには、Collections.unmodifiableList()(またはGuavaのImmutableListなど)を使用します。

(そして、それはあなたが[そうしない]という動作を必要とするために本当に正当な理由がある場合だけでList、またはRandomAccessListを使用しています。メソッドのシグネチャでArrayListを使用することが悪い形です。)

1

finalキーワードmyList変数に別の値が割り当てられないようにしますが、リストインスタンス自体の変更を防ぐことはできません。

必要なものは変更できないリストです。したがって、変更不可能なリストを使用することができます:

private static final ArrayList<String> myList =  
     Collections.unmodifiableList(Arrays.asList("One", "Two")); 
関連する問題