2016-02-25 30 views
4

我已經找到了這個(對我來說很奇怪)一段代碼。其實我也從來沒有見過這樣使用,從來沒有使用過自己,所以這是一件相當混亂......沿着使用HashMap的在這裏舉例Java方法返回對象還是直接操作它?

  • 線去,但其他對象會表現得同樣
public static void fillData(HashMap<Object, Object> dataMap){ 
    dataMap.put("key","value"); 
} 

現在,這是非常令人困惑,因爲我學會了你的方式做到這一點是更喜歡這個

public static HashMap<Object, Object> fillData(){ 
    HashMap<Object, Object> dataMap = new HashMap<>(); 
    dataMap.put("key","value"); 
    return dataMap; 
} 

現在是那裏的時候,我應該用一種方式或時間另一個?我對編程還很陌生,但我還沒有發現任何有關這種結構的東西。

我也已經嘗試了一圈,發現這僅適用於使用對象,而不是原語......

+2

一般來說,你應該儘量避免修改參數,但有些情況下這是不可能的。 –

+0

這個問題和答案可能也有幫助:http://stackoverflow.com/questions/7931523/methods-that-c​​hange-a-value-and-not-return-anything –

+0

順便說一句:基元是通過值傳遞和因此只能在對呼叫方沒有任何影響的方法中操作副本。 –

回答

3

嘛,想想其中方法操縱現有的非空映射的情況。在這種情況下,第一個例子非常合理。

1

我使用Google上午這同一主題和整個 this discussion來了,其中指出

public static void fillData(HashMap<Object, Object> dataMap){ 
    dataMap.put("key","value"); 
} 

第一種形式被認爲是「一種不好的做法,殘留或預OOP倍。」

0

允許對此類API的使用一看(由Map取代HashMap,要使用的接口,而不是具體實現總是更好):

Map<Object, Object> data = new Map<>(); 
fillData(data); 

這種穿過參數創建副作用代碼從API不可見。因此,更好地使該方法返回的結果,它也可以變得更流暢這樣:

Map<Object, Object> data = fillData(new HashMap<>()); 

會發生什麼,如果在地圖前,「鍵」的值?它會被替換嗎?

public static Map<Object, Object> filledData(Map<Object, Object> original) { 
    Map<Object, Object> result = new HashMap<>(original); 
    result.put("key","value"); 
    return result; 
} 

功能的方法是獨立於初始狀態:

Map<Object, Object> data = createFilledData(); 

使用什麼取決於需求的方法也可以通過返回原來的副本地圖製作無副作用, 一如既往。這是公共API還是內部幫助器方法?誰會使用它,新手還是專家?性能如何?

1

在java上,一個方法參數不是原始的持有對象的引用。 在你的榜樣

public static void fillData(HashMap<Object, Object> dataMap){ 
    dataMap.put("key","value"); 
} 

的數據圖引用一個對象,這個對象影響整個系統的引用,其顯示的是本對象中的任何改變。例如

;

public static void fillAll(){ 
     HashMap<Object, Object> dataMap1 = new HashMap<>(); 
     HashMap<Object, Object> dataMap2 = dataMap; 
     HashMap<Object, Object> dataMap3 = dataMap; 
     //dataMap1, dataMap2, dataMap3 are same object's references. 
     fillData1(dataMap1); 
     fillData2(dataMap2); 
     fillData3(dataMap3); 
     //here dataMap1 holds 3 different values in it. 
     //dataMap2, dataMap3 still same as dataMap1 
     dataMap3 = new HashMap<>(); 
     //here dataMap3 have a new object's reference but dataMap1 and dataMap2 still have 3 values in the map object. 
     //primitive types are different they are holding values directly. 
     int x = 5; 
     int y = x; 
     x++; //now x value is 6 but y value is still 5 
} 

public static void fillData1(HashMap<Object, Object> dataMap){ 
    dataMap.put("key1","value1"); 
} 

public static void fillData2(HashMap<Object, Object> dataMap){ 
    dataMap.put("key2","value2"); 
} 

public static void fillData3(HashMap<Object, Object> dataMap){ 
    dataMap.put("key3","value3"); 
} 
1

我遵循的做法是在兩種情況下:

方案1.如果調用方法更改傳遞給方法的複雜對象,然後它更有意義修改傳遞的對象並從該方法中不返回任何東西(void)。這些對象在java中是按值傳遞的(這裏的「值」是指複製並傳遞的對象引用信息),因此任何修改都會更新對象的主副本,並且不需要從方法返回任何內容。

場景2.如果調用方法利用傳遞的複雜對象,運行一些邏輯並準備另一種類型的複雜對象,那麼從該方法創建並返回這個新對象是有意義的。

回到你的問題 - 其靜態方法,因此它的實例獨立。我可以再次考慮兩種可能的場景:

場景1-如果您的「dataMap」可以在此方法調用之前啓動,並且它可能有其他一些鍵值對,那麼通過這個「dataMap」並讓該方法用附加的鍵值對更新此相同的地圖。在這種情況下,什麼都不會退回。方案2-如果你的「dataMap」在這個方法調用之前總是被認爲是一個新的空映射,那麼我看不到有任何理由去創建Map實例並在方法中傳遞它。如果方法創建該映射並返回爲方法返回參數,那麼它將代碼行數更少且更簡單。

兩種方式都有其適用性,根據給定的情況,我不會說一個比其他更好。

相關問題