メソッドから2つの値を返す必要があります。私のアプローチは次のとおりです:
メソッドで変更される唯一のことは、最後にそれらの2つの値をインスタンスのフィールドに割り当てることです。次に、そのオブジェクトのフィールドを参照することで、これらの値に対処できます。
それは良いデザインですか、なぜですか?
私はこれを次のように主張します:
要約すると、この「データオブジェクト」を、データと動作の両方を備えた本格的なクラスに変換できるかどうかを確認します。追加のコメントとして、状態が一度設定されるので、クラスを不変にすることができます。不変にすると、誤って設定されたり、後で変更されたりするのを防ぐのに役立ちます(たとえば、誰かがフィールドの1つをnullに設定して渡す)。
編集:Patkos Csabaが正しく指摘しているように、ここで適用されている原則は単一責任原則( [〜#〜] srp [〜#〜] )です-作成しようとしているクラスは実際に1つの責任(変更の理由として定義)。この設計ガイドラインは、2つのフィールドが1つのクラスに属しているかどうかを理解するのに役立ちます。ウィキペディアの例に固執するために、クラスはレポートの一種と見なすことができます。その場合、クラスは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;
}
}
このクラスは他のクラスから責任を奪っているようで、これはこのデザインは素晴らしいとは思えません。
Multible値を返すメソッドの場合は、むしろ
または
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;
}
}
メソッドからの複数の戻り値を独自のクラス/構造に配置することは、多くの場合 メッセージベースのシステム で使用されます 要求と応答 に対して1つのクラスがあります。この例は Simple Object Access Protocol(SOAP) です。
それは良いデザインですか?なぜですか?
少なくともそれはかなり一般的です。これが良いか悪いかはあなたの特別なユースケースに依存します。
短い答え:2つの値を持つ配列またはリストを返すことができます。
私は個人的に次のような2つの異なる方法を記述します
int x = obj.getX();
int y = obj.getY();