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