2012-07-20 103 views
2

我想寫一個Java函數有List對象作爲輸出參數。作爲輸出參數在Java列表

boolean myFunction(int x, in y, List myList) 
{ 
    ...Do things... 
    myList=anotherList.subList(fromIndex, toIndex); 
    return true 
} 

此之前,我調用函數我宣佈myList中如下: 列表myList中= NULL; 然後我調用函數myFunction(x,y,myList) 但是,當我嘗試操縱myList時,我發現myList仍然爲空。

我確定函數代碼中的變量「antherList」不爲空,我確信subList函數返回一個非空List。

是什麼原因,以及如何在Java函數中傳遞List作爲輸出參數? 非常感謝。

回答

4

Java總是使用按值傳遞。這意味着操作傳遞的變量不會影響調用者傳遞的變量。

爲了解決您的問題,也有一些可能性:

  • 返回子表:

    List myFunction(int x, int y) { return anotherList.subList(....);} 
    

    我知道這種方式得到你的布爾返回值的RID。

  • 創建一個結構,該結構保存指向List和的指針。

    class Reference <T> 
    { 
        public T ref; 
    } 
    
    boolean myFunction(int x, int y, Reference<List> listRef) 
    { 
         listRef.ref = anotherList.subList(....); 
         return true; 
    } 
    
  • 創建一個包含所有你希望該方法返回的輸出的結構:

    class MyFunctionOutput 
    { 
        List list; 
        boolean b; 
    } 
    
    MyFunctionOutput myFunction(int x, int y) 
    { 
        MyFunctionOutput out = new MyFunctionOutput(); 
        out.list = anotherList.subList(....); 
        out.b = true; 
        return out; 
    } 
    
  • 還是最簡單的方法:通過一個初始化列表,而不是零,讓功能添加子列表,就像Attila建議的那樣。

+0

偉大的Martjin,非常感謝你! – Rami 2012-07-20 15:12:17

4

您無法通過Java中的參數。你要麼需要陳述的返回類型列表或改變內容傳遞的列表中的

boolean myFunction(int x, in y, List myList) 
{ 
    ...Do things... 
    myList.clear(); 
    myList.addAll(anotherList.subList(fromIndex, toIndex)); 
    return true 
} 

:out參數意味着你改變通過包含該值的變量的值到功能。在你的情況下,這意味着要返回一個不同的List對象。相反,您正在返回相同的列表對象,但具有更改的內容。

將參數視爲傳遞值的本地副本:在函數返回時,將替換整個對象的任何更改都將丟失。如果你只是改變其內容/狀態,那麼這個改變將會保留,因爲你正在訪問同一個對象(本地副本由指向同一對象的參考組成)。一直用於演示目的,但您應該使用泛型來指定列表中包含的對象:例如List<String>而不是原始List類型

2

Java中的參考是按值傳遞的。所以你不能指定一個輸出參數

你可以做什麼(然而)是改變一個傳入的對象。所以在上面的例子中,你可以傳入一個空的List,並將其填充到你的調用方法中。

即在上面:

myList.addAll(...); 

你可能會想要斷定爲前提,傳遞的列表是空的。

我也許會建議這在Java世界中不是一個非常常見的模式。因爲輸出參數不存在,所以作爲參數傳入的參數會發生變化,這不是所期望的行爲,並且您最好創建一個合適的對象類型以返回。

1

myList變量是該函數的本地變量。引用是通過值傳遞的,而不是通過Java世界中的指針傳遞的。只要您退出,它將從上下文堆棧中刪除。一個可能的選擇是不返回布爾值,但返回列表本身。然後你可以測試null的列表來查看你的函數是否工作。

另一種選擇是實際創建您的列表,然後將其傳遞給函數(非空)。然後你的函數不需要創建一個新的列表,只需要爲它添加值。

+0

+1:*「引用是按值傳遞的,而不是通過指針」* – Mohayemin 2012-07-20 14:26:16

0

短的答案 - 剛剛返回新的列表作爲函數的返回值:

List myFunction(int x, in y, List myList) { 
    ...Do things... 
    return anotherList.subList(fromIndex, toIndex); 
} 

長的回答是Java複製你的對象的指針,當你調用一個函數,這意味着,如果你爲方法param分配一個新對象,它不會影響原始變量。因此如果您想更改對象值,則必須保存參數引用。