Java 如何克服原语是按值传递的事实

Java 如何克服原语是按值传递的事实,java,primitive,Java,Primitive,我有一段很长的代码可以计算两个值(double),我在一些地方使用了这段代码——为了坚持枯燥的原则,我应该将这段代码重构为一个不错的单元可测试方法。但是我不能让它返回两个double,double是基本的,所以不能通过值传递和操作。我能想到的最干净的方法是让这个方法返回一个double[]。有人能想出更好的办法吗 谢谢一个包含两个双字段的类(不可变)?甚至可能想向类中添加一些有趣的方法 另一种方法是让方法接受回调对象 double[] arr = {val1, val2}; return arr

我有一段很长的代码可以计算两个值(
double
),我在一些地方使用了这段代码——为了坚持枯燥的原则,我应该将这段代码重构为一个不错的单元可测试方法。但是我不能让它返回两个double,double是基本的,所以不能通过值传递和操作。我能想到的最干净的方法是让这个方法返回一个
double[]
。有人能想出更好的办法吗

谢谢

一个包含两个
字段的类(不可变)?甚至可能想向类中添加一些有趣的方法

另一种方法是让方法接受回调对象

double[] arr = {val1, val2};
return arr

或者用一对类似的类来封装2个值…

如果两个双倍可以被看作是一个逻辑的值配对,那么把它们捆绑在一个简单的对象中可能是有意义的吗?< /p> < p>我是一个C++的家伙,但是,创建一个自己的对象,称为Pair,它可以容纳2个double,并且可以通过引用传递,这对我来说是有意义的

首先,在Java中,所有变量都是按值传递的,而不仅仅是原语。只是对象是可变的。理解这一点很重要。例如:

public void addHour(Date date) {
  date.setTime(date.getTime() + 3600 * 1000);
}
日期是通过值传递的,但日期是可变的,因此可以对其进行修改,但请尝试执行以下操作:

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; }
}

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

  public class MyTwoDoubles {

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

       public double getOne() { ... }

       public double getTwo() { ... }
  }

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


您还可以为计算它们的方法提供一个double[]参数,并将计算值放入其中。这可能非常有效,因为如果性能很重要,调用方代码可以重用此数组进行后续调用。

创建一个新类,该类具有两个双重属性,其中包含getter和setter以及构造函数(以及equals和hashcode…),并使该方法返回该类型的对象。实现这一点的一般方法是使用Pair类。这是一种常见的模式,您应该到处都能找到代码片段(例如在netbeans代码库中)

您有几种选择:

  • 返回一个数组
  • 返回
    列表
  • 返回一个类的对象,该对象包含两个double
  • 顺便说一下,Java不通过引用传递对象。它通过值传递指向对象的指针。

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

    我想知道,Java有元组类吗?@chaospanion:还没有。可能是JDK7。在第一句话中,你的意思是“值”而不是“参考”吗?不!在Java中,所有变量都是按值传递的。原语按值传递,指向对象的指针按值传递。没有什么是真正通过引用传递的。事实证明了这一点,在Java中编写swap方法时,如果不
    return
    ing这两个值……嘿,在编辑时发表了我的评论。。。很抱歉。@Chinmay。。。除非将这两个值放入双精度[2]并传递数组;)@Andreas:数组仍然是按值传递的。与
    Date
    类似,数组只是一个可变对象,因此数组本身可以修改元素。如果性能很重要,调用方代码可以将此数组重新用于后续调用,这可能非常有效。如果我见过这样的优化,这是过早的,加上现代GC很难说什么是性能。。。所以要当心。