2012-02-15 10 views
2

複数の結果を返して分割する方法があることは知っていますが、これは厄介です。Javaのメソッドで複数の戻り値を処理する理想的な方法

私は2次方程式ソルバーをやっています。明らかに、複数の戻り値が必要な場合があります。私は、このようなケースを処理するための好ましい方法が何であるか疑問に思っています。私は一般的な「ベストプラクティス」のような回避策(文字列を返して2つに分割するなど)クリーン/よく書かれたコードのため

+1

係数を含む多項式クラスのインスタンスを返します。 pcalcaoの回答ごとに。 –

答えて

11

短い答え:結果をカプセル化し、そのクラスのインスタンスを返すクラスを作成します。

もう少し拡張バージョン: Java: returning two ints from a method call

私はそれがどのように感じ、 "汚い" を理解しています。 「純粋な」Javaスタイルのコーディングでは、すべてのクラスを作成してしまうので、実際には余計に感じるからです(私もPythonでコードしていますが、は本当にになります)。しかし、それを行う "クリーンな"方法に関して、私は多くの解決策を見ていません。他のものは、あなたの実装を呼び出すメソッドが、インターフェースを通して明示的でない詳細を知っていることを前提としています。

これは残念ですが、それはあなたのコード(およびそれを使用するコード)をより読みやすく、そして長い道のり(人格のように)にします。

+0

でも、ちょうど「汚い」とは思えず、理想的ではありません。一般的に複数の方法に分割するか、時にはそれを回避する必要があるという事実を処理する方が良いと考えられていますか? – maezr

+1

@maezrどのようにこれは乱雑ですか? 「getAnApple」というメソッドがあり、体重、直径、色を含むリンゴオブジェクトを返します。 –

+0

@maezr - 「回避する」とは何ですか?あなたが "複数のアイテムを返す"ことを可能にするスクリプト言語でさえ、実際にはそうではありません。彼らは動的なリストまたは配列にそれらをラップして、その1つのことを返しています。 –

2

この特定の状況では、必要に応じて配列やその他のコレクションオブジェクトを返さないのはなぜですか?より複雑な状況では、適切な情報をすべて保持し、そのインスタンスを返すクラスを作成する必要があります。

0

他にも言及したように、すべての結果を保持するために使用されるコンテナクラスのインスタンスを返すことができます。

また、メソッドに結果が移入されたコンテナオブジェクトを渡して、呼び出し後にそれらを引き出すことができます。これは、「余分な」情報を返すメソッドオーバーロードのために有用である:続行する

public String compute(int arg) { 
    return compute(arg, null); 
} 

public String compute(int arg, MyContainer<String> extraInfoOut) { 
    String answer = ... 
    if (extraInfoOut != null) { 
     String extraInfo = ... 
     extraInfoOut.set(extraInfo); 
    } 
    return answer; 
} 

... 

MyContainer<String> container = MyContainer.empty(); 
String answer = compute(someInt, container); 
String extraInfo = container.get(); 
1

一つの方法は、アレイまたはすべての検索結果を含むコレクションを返し、前述したように、です。ただし、この方法では、どの戻り値がどこに格納されているのか混乱する可能性があります。次のようにすることができます:

public static final String TEMPERATURE = "TEMPERATURE"; 
public static final String SPEED  = "SPEED"; 
//... 
public Map<String, int> doSomeStuff(){ 
    Map<String, Object> map = HashMap<String, int>(); 
    // Calculations here... 
    map.put(TEMPERATURE, 1); 
    map.put(SPEED, 2); 
    //... 
    return map; 
} 

// You can then retrieve all results by 
int temp = map.get(TEMPERATURE); 
int speed = map.get(SPEED); 
関連する問題