2013-12-12 26 views
1

有沒有辦法顯示方法的參數作爲返回值?顯示方法的參數作爲返回值

如果我想返回一個值,這是沒有問題的:

public Set<Integer> addIntegerToSet(final int i) 
{ 
    Set<Integer> intSet = new HashSet<>(); 
    intSet.add(i); 

    return intSet; 
} 

可以很容易地看到,該方法返回一個集合。

但是,如果我想有一個方法返回兩個值,我需要一個解決方法:

public Set<Integer> addIntegerToSet(final int i, Set<Integer> returnIntMap) 
{ 
    Set<Integer> intSet = new HashSet<>(); 
    intSet.add(i); 

    returnIntMap.add(i); 

    return intSet; 
} 

這兩段代碼只是一個例子來說明我的問題,他們有沒有實際用處。

但是,我想讓用戶明白這個集合(returnIntMap)也被操縱了。通常的做法是在參數前面放置一個「final」,但不會在方法內操作,但這不會在Java標準類中實現。

那麼,如何顯示returnIntMap在方法中被操縱,而不是隻在java doc註釋中提及它。有沒有公​​約?

回答

2

它在Java中不是直接可能的。

Java使用按值傳遞。對象和數組實際上是指針,所以即使它看起來像通過引用傳遞,實際上引用也是作爲值傳遞的。這意味着你可以修改對象,但不能引用它。

final沒有那麼用,因爲它只是聲明指針不能被修改,而是它指向的對象可以。因此,在公共接口中將方法的參數聲明爲final沒有多大用處。不過,這在實際實施中是一個很好的保障。簡而言之:final != const和Java沒有相應的const

即使您在技術上只能返回一個對象,也沒有什麼能阻止您返回一個將多個新對象包裝成一個的容器。

如果您只想(內部)記錄哪些對象被修改,您可以使用註釋將參數標記爲例如@ReadOnly@ReadWrite。這些不是我認識的標準或任何圖書館的一部分,儘管可能存在一個。即使沒有,你仍然可以定義你自己的註釋。

0

首先,你可以這樣做 -

public static Set<Integer> addIntegersToSet(Set<Integer> set, final int ... arr) { 
                 // <-- Receive a Set and a 
                 // variable number of ints. 
    for (int i : arr) { // add each int to the set (possibly none to add). 
    set.add(i); 
    } 
    return set; // return the set. 
} 

然後,你可以檢查前(後)設定的大小,看看你有多少個整數(S)添加到您的集合。 要使您的設置不可變,您可以使用Collections.unmodifiableSet。見documentation。但是你不能在Set中添加任何東西。我想你想記錄你什麼時候改變一個Set。

+0

是真的,但正如我所說:我應該只是一個例子。我想查看任何數據類型的更大圖片......就像處理多種返回類型的通用約定一樣。 –

1

你想要做的是通過引用你的方法參數來傳遞。這在Java中不會發生。 Java根據價值進行傳遞。

0

我正在談論工作。
由於您正在傳遞集合,並且該方法還返回一個集合。所以你可以在你的調用方法中比較它們是否有變化。
(你可以通過達到或firstSet.equals(secondSet)firstSet.containsAll(secondSet)比較)

1

你真的不能標記參數作爲IN或IN/OUT。你可以寫一個更簡潔的代碼,將你的兩個返回參數放在一個新類中。因此,您將兩個返回參數作爲唯一的返回參數:

public class ReturnParam { 
    private final Set<Integer> intSet; 
    private final Set<Integer> returnIntMap; 

    public ReturnParam(final Set<Integer> intSet, final Set<Integer> returnIntMap) { 
     this.intSet = intSet; 
     this.returnIntMap = returnIntMap; 
    } 

    public Set<Integer> getIntSet() { 
     return intSet; 
    } 

    public Set<Integer> getReturnIntMap() { 
     return returnIntMap; 
    } 
} 

// and your method could look like this 
public ReturnParam addIntegerToSet(final int i) { 
    Set<Integer> intSet = new HashSet<>(); 
    Set<Integer> returnIntMap = new HashSet<>(); 

    intSet.add(i); 
    returnIntMap.add(i); 

    return new ReturnParam(intSet, returnIntMap); // put it into the ReturnParam wrapper class 
} 
相關問題