2012-05-13 12 views
5

前文:私は結果を返すために、リストや他のコレクションを使用しての承知していますが、その後、私は結果を出し摘採リストを通過する必要があります。第二の例を参照返す複数の値

プリアンブル-2:I 「私はJavaメソッド呼び出しから複数のオブジェクトを返すための便利な方法を探しています


『...これはJavaでサポートされていません』を超えた答えを探してい。

PHPのようの種類:

list ($obj1, $obj2, ...) foobar(); 

私は本当に例の引数にホルダーオブジェクトを渡すのに疲れてきています。その後、

class Holder { 
    int value; 
} 

Holder h1=new Holder(); 
Holder h2=new Holder(); 

と:

o.foobar(h1,h2); 

誰かがこれをうまく乗り越えるためのエレガントな方法を見つけたなら、非常に興味があります。リストを使用して


List<String> = foobar(); 

これには2つの欠点があります。

// this is on the callee side of the house 
ArrayList<String> result = new ArrayList<String> 
result.add("foo"); 
result.add("bar"); 

:私は最初の家の呼び出し先側にリストをパックする必要があり

は、その後、呼び出し側で結果を抜き出す必要があります。

// This is on the caller side 
List<String> result = foobar(); 
String result1 = result.get(0); 
String result2 = result.get(1); // this is not as elegant as the PHP equivalent 

はさらに、私はオブジェクトのリストを返し、その後、各オブジェクト...ではない、かなり

感謝をキャストしなければならない文字列、整数を言う私は、異なるタイプのオブジェクトを返すように望んでいたと言います。

+3

リストを返すだけです – keyser

+0

リストを返すと何が問題になりますか? –

+2

が編集されました。 Javaでの "古い手"はこの質問をしませんでした。元のものはちょっと悲しいものでした。 –

答えて

8

一般的なタプルクラスを使用することは私が想像することができる最も近いものです。例えばこれは、呼び出し先側に1つの文のコンストラクタを可能に

public class T3<A, B, C> { 
    A _1; 
    B _2; 
    C _3; 
    T3(A _1, B _2, C _3) { 
     this._1 = _1; 
     this._2 = _2; 
     this._3 = _3; 
    } 
} 

、::

public T3<String, Integer, Character> getValues() { 
    return new T3<String, Integer, Character>("string", 0, 'c'); 
} 

しかし、誰ホルダーアイデアを与えるために、3つの戻り値のため、このような汎用クラスは、このようなものを見ることができます呼び出し先によるインスタンス構築が行われます。

それぞれの戻り値の数は、独自のタプルクラスを必要とします。 Functional Java libraryにあるようなものがあるかもしれません。参考までに、N-Tuple implementationです。

はjava.util.AbstractMap.SimpleEntryはどうなる2値の場合の場合:とにかく

return new SimpleEntry<String, Integer>("string", 0); 

、私は複数の戻り値のために考慮するために、2つの重要なポイントを参照してください。

  1. 型指定された戻り値
  2. はそれとして

として退屈各戻り値の意味を指摘しますすべてのレスポンス値を保持する別のクラスを作成し、メソッドの戻り値として宣言することをお勧めします。こうすることで、各値の意味を強調することができます。

4

ListSet、またはMapを返すことはできますか?

+1

面倒な解決策 - 私の質問の例2を参照してください – user1172468

5

次のようなシグネチャを持つような方法で持つことができます。

List<Holder> foobar(); 
1

あなたは、この目的のためにCollectionクラスのいずれかを使用できます。このLessonは、あなたに最適なものを決めるのに役立ちます。拡張されたホルダーを返す

+0

こんにちは、私はこれを認識しています、私はこれの典型的な救済策のいずれかを探していることを明確にした。 – user1172468

2

リストを返すよりも優れているようだ:

class Holder { 
    int value1; 
    String value2; 
    Holder(int value1, String value2) {} 
} 

Holder foobar() { 
    return new Holder(1, "bar"); 
} 
+0

Ya、可能であれば冗長な冗長表示:-(応答はありがたいですが – user1172468

+0

@ user1172468冗長性はJavaの固有のプロパティですC++のtypedefと演算子のオーバーロードの魔法は長くなるかもしれませんが、詳細。 –

2

あなたは、同じタイプの複数の値を返す必要がある場合は、リストまたは設定が適切です。たとえば、可変長のユーザー名リストをリストとして返すことは完全に有効です。あなたが常に固定数の値を返すことを知っているなら、私は配列を使います。例えば、3つの別個の整数として、ユーザIDのいくつかの種類を返すメソッドでは、私が使用する:

public int[] getUserId(){ 
    int[] returnArray = new int[3]; 
    returnArray[0] = getFirstPart(); 
    returnArray[1] = getSecondPart(); 
    returnArray[2] = getThirdPart(); 

    return returnArray; 
} 

を発信者コードでは、値を得ることarray[0]array[1]array[2]ように単純です。これはCollectionよりはるかに簡単で、ユーザーIDは3つの整数として定義されているため、何も破壊しません。

本当に複数の異なる値を返す必要がある場合は、ホルダークラスが最適なオプションです。それ以外の方法はありません。 Javaでは複数の戻り値はサポートされていません。しかし、私はむしろデザインの観点からソリューションを検討したいと考えています。あるクラスが複数の別個の値を返す必要がある場合、おそらく多くのものがありますが、他のものと無関係なものもあります。 1つのコード(クラス、メソッド)は、常に明確な目的と明確な責任を持っていなければなりません。複数の異なる値を返すのではなく、メソッドを複数の短いメソッドに分割するか、すべての機能を外部化するためのインターフェイスを定義することを検討します。それらの戻り値が何らかの方法で関連していて、それを分離しても意味がない場合は、自分でクラスに値すると思います。

関連する問題