4

2 つの値 ( ) を計算する長いコードがありdoublesます。このコードをいくつかの場所で使用します。DRY の原則を守るために、このコードをユニット テスト可能な適切なメソッドにリファクタリングする必要があります。ただし、2 つの double を返すようにすることはできません。double はプリミティブであるため、値で渡して操作することはできません。これを実行する最もクリーンな方法は、このメソッドが を返すようにすること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);
}

日付は変更されません。なんで?日付は参照ですが、値によって渡されるためです。

第二に、これらのダブルスは何らかの形で互いに関連していますか?その場合、次のようなこの関係を説明するクラスでそれらをラップします。

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[] arr = {val1, val2};
return arr

または、2つの値をカプセル化するPairのようなクラスを使用します。

于 2010-01-21T23:06:05.820 に答える
3

double2 つのフィールドを持つクラス (不変) ? クラスにいくつかの興味深いメソッドを追加したい場合もあります。

もう 1 つの方法は、メソッドがコールバック オブジェクトを受け取るようにすることです。

于 2010-01-21T23:05:44.753 に答える
2

2つのdoubleが値の論理的なペアと見なすことができる場合、それらを単純なオブジェクトにバンドルすることは理にかなっているでしょうか。

于 2010-01-21T23:06:03.773 に答える
2

私はもっ​​とC++の人ですが、2つのdoubleを保持でき、参照によって渡すことができる、Pairという独自のオブジェクトを作成することは私には理にかなっています。

于 2010-01-21T23:07:13.053 に答える
2

必要に応じて、getterとsetterおよびコンストラクターを使用して2つのdoubleプロパティを持つ新しいクラスを作成し(equalsとhashcode ...)、メソッドがそのタイプのオブジェクトを返すようにします。これを行う一般的な方法は、Pairクラスです。これは一般的なパターンであり、コードスニペットはどこにでもあるはずです(たとえば、netbeansコードベースなど)。

于 2010-01-21T23:08:47.147 に答える
2

いくつかのオプションがあります。

  1. 配列を返す
  2. を返すList<double>
  3. 2つのdoubleをラップするクラスのオブジェクトを返します

ちなみに、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 を使用できますが、これで目的が解決することを願っていますが、それでも良い設計として、メソッド内のオブジェクト値を変更しないことをお勧めします。代わりに、コードを 2 回呼び出して 2 つの異なる値を返し、それを元の値に割り当てるようにコードをリファクタリングします。メソッド内でオブジェクトの値を変更することはお勧めできません。

于 2010-01-22T06:20:01.120 に答える