2017-06-18 88 views
0

我定義了靜態最終ArrayList,然後將其發送給其他類進行更改。但是由於他是最終的,所以它只能在本地進行更改,就像我的例子中的int一樣。爲什麼它也在Main類中改變了?最終靜態數組列表功能已更改

小的代碼示例:

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)。

(和它的壞的形式,方法簽名使用ArrayList。只需使用List,或RandomAccessList如果你有一個真的充分的理由需要這種行爲[你不這樣做。)

1

final關鍵字防止myList變量被分配另一個值,但它不會阻止對列表實例本身的更改。

你需要的是一個無法修改的列表。因此,您可以使用不可修改的列表:

private static final ArrayList<String> myList =  
     Collections.unmodifiableList(Arrays.asList("One", "Two"));