如何克服原语通过价值传递的事实

时间:2010-01-21 23:03:35

标签: java primitive

我有一段很长的代码可以为我计算两个值(doubles),我在几个地方使用这段代码 - 坚持DRY原则我应该将这段代码重构为一个不错的代码单元可测试方法。但是我不能让它返回两个双打,双打是原始的,所以不能通过值传递和操纵。我能想到的最干净的方法是让这个方法返回double[]。谁能想到更好的方法?

由于

10 个答案:

答案 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)

您有几种选择:

  1. 返回一个数组
  2. 返回List<double>
  3. 返回包含两个双打的类的对象
  4. 顺便说一下,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可以使用,希望这解决了目的 但仍然作为一个好的设计我建议你不要改变方法内的对象值。 而是以这样的方式重构代码,您可以调用它两次并返回两个不同的值,然后将其分配给原始代码。 作为一种良好的做法,不建议在方法中改变对象值