2010-01-21 44 views
4

我有一段代碼爲我計算兩個值(doubles),我在幾個地方使用這段代碼 - 堅持DRY原則我應該重構這一點代碼到一個很好的單元可測試的方法。然而,我不能讓它返回兩個雙打,雙打是原始的,所以不能通過價值和操縱傳遞。我能想到的最簡潔的方法是使這種方法返回double[]。任何人都可以想出更好的方法嗎?如何克服基元被值傳遞的事實

感謝

+0

我想知道,Java有一個Tuple類嗎? – ChaosPandion 2010-01-21 23:05:42

+0

@ChaosPandion:還沒有。可能是JDK7。 – 2010-01-21 23:07:53

回答

12

首先,全部變量按Java值傳遞,而不僅僅是基元。只是對象可能是可變的。理解這一點很重要。例如:

public void addHour(Date date) { 
    date.setTime(date.getTime() + 3600 * 1000); 
} 

日期是按值傳遞,但Date是可變的,因此它可以被修改,但嘗試這樣做:

public void addHour(Date date) { 
    date = new Date(date.getTime() + 3600 * 1000); 
} 

,它不會更改日期。爲什麼?因爲日期是一個參考,但通過值傳遞。

其次,這些雙打以某種方式相互關聯嗎?如果在一個類,以便將它們包裝不是這樣描述關係:

public class Coordinate { 
    private final double x; 
    private final double y; 

    public Coordinate(double x, double y) { 
    this.x = x; 
    this.y = y; 
    } 

    public double getX() { return x; } 
    public double getY() { return y; } 
} 
+2

不,不,不,不!所有變量都通過Java中的值傳遞。基元通過值傳遞,指向對象的指針通過值傳遞。沒有任何東西真的被引用通過。事實證明,事實證明,如果沒有''返回'這兩個值,你就不能在Java中編寫交換方法... – 2010-01-21 23:11:03

+0

在第一句中,你的意思是「價值」而不是「引用」嗎? – Rob 2010-01-21 23:10:55

+0

@Rob:是的,我的意思是「按價值傳遞」。錯字修正,謝謝。 – cletus 2010-01-21 23:11:55

3

類(immutable)的兩個double領域?可能甚至想爲班級添加一些有趣的方法。

另一種方法是讓該方法採用回調對象。

3
double[] arr = {val1, val2}; 
return arr 

或去封裝2個值的對類似類...

2

如果兩個雙打可以被認爲是值的邏輯配對,那麼它可能是有意義的捆綁他們一個簡單的對象?

2

我更喜歡C++的人,但是創建一個可以容納2個雙打併可以通過引用傳遞的自己的對象對我來說很有意義。

1

雙陣列是最明顯的答案。你可以把它多了一點安全具有這樣的包裝對象:

public class MyTwoDoubles { 

     public MyTwoDoubles(double one, double two) { ... } 

     public double getOne() { ... } 

     public double getTwo() { ... } 
    } 
4

您可以用於此目的的一類封裝它們。

您也可以爲計算它們的方法賦予一個double []參數,並將其放入計算值的位置。這可能相當有效,因爲如果性能很重要,調用方代碼可以重複使用此數組以用於連續調用。

+0

「這可能相當有效,因爲如果性能很重要,調用者代碼可以重複使用此數組進行連續調用。」這是過早的優化,如果我看過一個,再加上現代的GC,很難說什麼是高性能的...所以要小心。 – sleske 2010-05-07 00:08:21

2

如果你喜歡(和equals和hashcode ...)並且使方法返回該類型的對象,那麼創建一個新的類,該類有兩個具有getter和setter和constructor的double屬性。一個通用的方法來做到這一點將是一個Pair類。這是一種常見模式,您應該隨時隨地查找代碼片段(例如,在NetBeans代碼庫中)。

2

您有幾種選擇:

  1. 返回數組
  2. 返回List<double>
  3. 返回一個類的對象,它包裝你的兩個雙打

順便說一下,爪哇是否不是通過引用傳遞對象。它通過值傳遞指向對象的指針。 http://javadude.com/articles/passbyvalue.htm

0

你可以使用引用類型的Wrapper類 對於每個值類型,你可以找到一個包裝類。 您的情況java.lang.Double可以使用,希望這可以解決目的 但作爲一個好的設計,我建議你不要改變方法內的對象值。 而是以這種方式重構代碼,將其稱爲兩次並返回兩個不同的值,然後將其分配給原始代碼。 作爲一個良好的做法,它不可能改變方法內的對象值