我有一段很长的代码可以为我计算两个值(doubles
),我在几个地方使用这段代码 - 坚持DRY原则我应该将这段代码重构为一个不错的代码单元可测试方法。但是我不能让它返回两个双打,双打是原始的,所以不能通过值传递和操纵。我能想到的最干净的方法是让这个方法返回double[]
。谁能想到更好的方法?
由于
答案 0 :(得分: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);
}
它不会改变日期。为什么?因为date是引用,但是按值传递。
其次,这些双打是否以某种方式相互关联?如果是这样将它们包装在一个类中,而不是描述这种关系,如:
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; }
}
答案 1 :(得分:4)
为此可以将它们封装在一个类中。
您还可以为计算它们的方法提供double []参数以及将计算值放入的位置。这可能非常有效,因为如果性能很重要,调用者代码可以重复使用此数组进行连续调用。 / p>
答案 2 :(得分:3)
包含两个double
字段的类(不可变)?甚至可能想在课堂上添加一些有趣的方法。
另一种方法是让方法采用回调对象。
答案 3 :(得分:3)
double[] arr = {val1, val2};
return arr
或者使用类似于Pair的类来封装2个值......
答案 4 :(得分:2)
如果两个双打可以被认为是值的逻辑配对,那么将它们捆绑在一个简单的对象中可能是有意义的吗?
答案 5 :(得分:2)
我更像是一个C ++人,但是创建一个你自己的对象,它可以容纳2个双打并且可以通过引用传递给我。
答案 6 :(得分:2)
如果你喜欢(和equals和hashcode ...),创建一个具有getter和setter以及构造函数的两个double属性的新类,并使该方法返回该类型的对象。这样做的通用方法是Pair类。这是一种常见的模式,你应该在任何地方找到代码片段(例如在netbeans代码库中)。
答案 7 :(得分:2)
您有几种选择:
List<double>
顺便说一下,Java 不通过引用传递对象。它按值传递指向对象的指针。 http://javadude.com/articles/passbyvalue.htm
答案 8 :(得分:1)
双阵列是最明显的答案。你可以通过这样的包装器对象使它更安全一些:
public class MyTwoDoubles {
public MyTwoDoubles(double one, double two) { ... }
public double getOne() { ... }
public double getTwo() { ... }
}
答案 9 :(得分:0)
您可以使用引用类型的Wrapper类 对于每种值类型,您都可以找到包装类。 对于你的情况java.lang.Double可以使用,希望这解决了目的 但仍然作为一个好的设计我建议你不要改变方法内的对象值。 而是以这样的方式重构代码,您可以调用它两次并返回两个不同的值,然后将其分配给原始代码。 作为一种良好的做法,不建议在方法中改变对象值