我有一段代碼爲我計算兩個值(doubles
),我在幾個地方使用這段代碼 - 堅持DRY原則我應該重構這一點代碼到一個很好的單元可測試的方法。然而,我不能讓它返回兩個雙打,雙打是原始的,所以不能通過價值和操縱傳遞。我能想到的最簡潔的方法是使這種方法返回double[]
。任何人都可以想出更好的方法嗎?如何克服基元被值傳遞的事實
感謝
我有一段代碼爲我計算兩個值(doubles
),我在幾個地方使用這段代碼 - 堅持DRY原則我應該重構這一點代碼到一個很好的單元可測試的方法。然而,我不能讓它返回兩個雙打,雙打是原始的,所以不能通過價值和操縱傳遞。我能想到的最簡潔的方法是使這種方法返回double[]
。任何人都可以想出更好的方法嗎?如何克服基元被值傳遞的事實
感謝
首先,全部變量按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; }
}
類(immutable)的兩個double
領域?可能甚至想爲班級添加一些有趣的方法。
另一種方法是讓該方法採用回調對象。
double[] arr = {val1, val2};
return arr
或去封裝2個值的對類似類...
如果兩個雙打可以被認爲是值的邏輯配對,那麼它可能是有意義的捆綁他們一個簡單的對象?
我更喜歡C++的人,但是創建一個可以容納2個雙打併可以通過引用傳遞的自己的對象對我來說很有意義。
雙陣列是最明顯的答案。你可以把它多了一點安全具有這樣的包裝對象:
public class MyTwoDoubles {
public MyTwoDoubles(double one, double two) { ... }
public double getOne() { ... }
public double getTwo() { ... }
}
您可以用於此目的的一類封裝它們。
您也可以爲計算它們的方法賦予一個double []參數,並將其放入計算值的位置。這可能相當有效,因爲如果性能很重要,調用方代碼可以重複使用此數組以用於連續調用。
「這可能相當有效,因爲如果性能很重要,調用者代碼可以重複使用此數組進行連續調用。」這是過早的優化,如果我看過一個,再加上現代的GC,很難說什麼是高性能的...所以要小心。 – sleske 2010-05-07 00:08:21
如果你喜歡(和equals和hashcode ...)並且使方法返回該類型的對象,那麼創建一個新的類,該類有兩個具有getter和setter和constructor的double屬性。一個通用的方法來做到這一點將是一個Pair類。這是一種常見模式,您應該隨時隨地查找代碼片段(例如,在NetBeans代碼庫中)。
您有幾種選擇:
List<double>
順便說一下,爪哇是否不是通過引用傳遞對象。它通過值傳遞指向對象的指針。 http://javadude.com/articles/passbyvalue.htm
你可以使用引用類型的Wrapper類 對於每個值類型,你可以找到一個包裝類。 您的情況java.lang.Double可以使用,希望這可以解決目的 但作爲一個好的設計,我建議你不要改變方法內的對象值。 而是以這種方式重構代碼,將其稱爲兩次並返回兩個不同的值,然後將其分配給原始代碼。 作爲一個良好的做法,它不可能改變方法內的對象值
我想知道,Java有一個Tuple類嗎? – ChaosPandion 2010-01-21 23:05:42
@ChaosPandion:還沒有。可能是JDK7。 – 2010-01-21 23:07:53