メソッドから2つの値を返す必要があります。私のアプローチは次のとおりです。
- これらの2つの値を保持するために使用される2つのフィールドを持つ内部クラスを作成します
- そのクラス内にメソッドを配置します
- クラスをインスタンス化し、メソッドを呼び出します。
メソッドで変更される唯一のことは、最終的にインスタンスのフィールドにこれらの2つの値を割り当てることです。次に、そのオブジェクトのフィールドを参照することで、これらの値に対処できます。
それは良いデザインですか?それはなぜですか?
メソッドから2つの値を返す必要があります。私のアプローチは次のとおりです。
メソッドで変更される唯一のことは、最終的にインスタンスのフィールドにこれらの2つの値を割り当てることです。次に、そのオブジェクトのフィールドを参照することで、これらの値に対処できます。
それは良いデザインですか?それはなぜですか?
回答:
私はこれを次の行に沿って議論します:
要約すると、この「データオブジェクト」を、データと動作の両方を備えた本格的なクラスに変えることができるかどうかがわかります。追加のコメントとして、状態が1回設定されるため、クラスを不変にすることができます。不変にすると、誤って設定されたり、後で変更されたりすることを防ぐのに役立ちます(たとえば、誰かがフィールドの1つをnullに設定して渡すなど)。
編集:Patkos Csabaが正しく指摘しているように、ここで適用されている原則は単一責任原則(SRP)です-作成しようとしているクラスには実際に1つの責任があります(変更の理由として定義)。この設計ガイドラインは、2つのフィールドが単一のクラスに属しているかどうかを判断するのに役立ちます。ウィキペディアの例に固執するには、クラスをレポートの一種と見なすことができます。この場合、SRPに準拠していますが、追加情報なしでコメントすることは困難です。
Pythonなどの他の言語で機能するタプルの概念があります。
簡単に再利用できるこのジェネリッククラスのインスタンスを返すことができます。
public class TypedTuple<L, R> implements Serializable {
private static final long serialVersionUID = 1L;
protected L left;
protected R right;
protected TypedTuple() {
// Default constructor for serialization
}
public TypedTuple(L inLeft, R inRight) {
left = inLeft;
right = inRight;
}
public L getLeft() {
return left;
}
public R getRight() {
return right;
}
}
create()
コンストラクターで型パラメーターを指定する必要を回避するために、一般的な静的メソッドがあると便利な場合があります。また、2タプルの値しか表すことができないPair
のでTuple
、このクラスの名前はでなく、このクラスにします。
このクラスは別のクラスから責任を奪っていると思われるため、このデザインは素晴らしいものではないと考えさせられます。
マルチブル値を返すメソッドの場合、私はむしろ
または
2番目のオプションの例:
public Class FooBarRetval {
private String foo;
private int bar;
public FooBarRetval (String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
メソッドからの複数の戻り値を独自のクラス/構造に入れることは、Requestとresponseの 1つのクラスを持つメッセージベースのシステムで よく使用されます。この例は、 Simple Object Access Protocol(SOAP)です。
それは良いデザインですか?それはなぜですか?
少なくともそれは非常に一般的です。これが良いか悪いかは、特別なユースケースに依存します。
短い答え:2つの値を持つ配列またはリストを返すことができます。
私は個人的に、次のような2つの異なるメソッドを記述します。
int x = obj.getX();
int y = obj.getY();
BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)
。配列の戻り値として2つの整数を返します。