4

我有一段很长的代码可以doubles为我计算两个值(但是我不能让它返回两个双打,而且双打是原始的,所以不能按值传递和操纵。我能想到的最简洁的方法是让这个方法返回一个double[]. 谁能想到更好的方法?

谢谢

4

10 回答 10

14

首先,所有变量在 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; }
}
于 2010-01-21T23:07:19.350 回答
4

为此,您可以将它们封装在一个类中。

您还可以为计算它们的方法提供一个 double[] 参数以及将计算值放入的位置。这可能相当有效,因为如果性能很重要,调用者代码可以将此数组重用于连续调用。

于 2010-01-21T23:08:05.250 回答
3

具有两个double字段的类(不可变)?甚至可能想在类中添加一些有趣的方法。

另一种方法是让该方法采用回调对象。

于 2010-01-21T23:05:44.753 回答
3
double[] arr = {val1, val2};
return arr

或者使用封装 2 个值的类 Pair 类...

于 2010-01-21T23:06:05.820 回答
2

如果这两个双精度可以被认为是值的逻辑配对,那么将它们捆绑在一个简单的对象中可能有意义吗?

于 2010-01-21T23:06:03.773 回答
2

我更像是一个 C++ 人,但是创建一个你自己的名为 Pair 的对象,它可以容纳 2 个双精度并且可以通过引用传递,这对我来说很有意义。

于 2010-01-21T23:07:13.053 回答
2

创建一个新类,该类具有两个具有 getter 和 setter 以及构造函数的双重属性(以及 equals 和 hashcode ...),并使该方法返回该类型的对象。一种通用的方法是使用 Pair 类。这是一种常见的模式,您应该可以在任何地方找到代码片段(例如在 netbeans 代码库中)。

于 2010-01-21T23:08:47.147 回答
2

你有几个选择:

  1. 返回一个数组
  2. 返回一个List<double>
  3. 返回一个包含两个双打的类的对象

顺便说一句,Java 不通过引用传递对象。它通过值传递指向对象的指针。 http://javadude.com/articles/passbyvalue.htm

于 2010-01-21T23:09:04.753 回答
1

双数组是最明显的答案。您可以通过使用这样的包装器对象使其更安全:

  public class MyTwoDoubles {

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

       public double getOne() { ... }

       public double getTwo() { ... }
  }
于 2010-01-21T23:07:48.713 回答
0

您可以使用引用类型的包装器类。对于每种值类型,您都可以找到一个包装器类。对于您的情况,可以使用 java.lang.Double,希望这可以解决问题但仍然作为一个好的设计,我建议您不要更改方法内的对象值。而是以这样的方式重构代码,您调用它两次并返回两个不同的值,然后将其分配给原始值。作为一种好的做法,不建议在方法内更改对象值

于 2010-01-22T06:20:01.120 回答