web-dev-qa-db-ja.com

Javaメソッド:n-Tupleオブジェクトがないのはなぜですか?

Java言語自体の一部として、Javaメソッドから複数の値を返す(標準、Java認定)ソリューションがないのはなぜですか開発者は、マップ、リスト、ペアなどの独自の手段を使用する必要がありますか?なぜJavaはn-Tupleオブジェクトをサポートしないのですか?

特に、2つのオブジェクトを一緒に(タンデムで)変更する可能性のある単純なプライベートメソッドを考えており、その場合、戻り値としての型付きオブジェクトは過剰に聞こえます。

47
Saket

Javaメソッドは、正確にゼロまたは1つの値を返します。それはis Javaの標準です。複数の値を返す必要がある場合は、複数の値を持つオブジェクトを作成して返します。

9
DwB

2つのオブジェクトを返す場合は、通常、代わりに2つのオブジェクトをカプセル化する単一のオブジェクトを返します。

4
Psychologist

これを達成するためのハック的な方法はたくさんありますが、1つの方法はObject[]、しかし、あなたは心配するインデックスとヌルポインタチェックを持っています、それはただ厄介になります。別の方法は、Stringを返すことですが、それを解析する必要があり、厄介になります。

本当の質問はなぜだと思いますか?

ここに問題があります-私があなたとプロジェクトに取り組んでいて、このタイプの動作を見た場合、それがどのように処理されるべきかを見ることができるように書き直します。コードサンプルを提供する場合は、説明のために書き直します。

メソッドの能力を超えるデータを返す必要がある場合、単一の責任でメソッドを記述します。オブジェクトを使用するか、より小さなメソッドに分割する必要があります。

3
Travis

メソッドから複数の値を返すことは推奨される方法ではありません(in Java)。

メソッドから無関係な値が必要な場合、それらの値を含むオブジェクトのような異なるデータ構造が必要です。同じクラスの複数のインスタンス(つまり、複数のStrings)が必要な場合、必要に応じて配列またはコレクションを返す必要があります。

他の言語で複数の値を返す(Goなど)は、たとえばerorコードを返すために使用されますが、Javaは例外を使用して別の方法で設計されました。

1
OscarRyz

利用可能な新しいスタイルのパターンがあり、JavaScriptなどの言語で見られる「すべて非同期」の性質に適合します。

私のコードの多くは最近このように見えます:-)

public class Class1 {

    public interface Callback {
       void setData(String item1, String item2);
    }
    public void getThing(Callback callback) {
        callback.setData("a", "b");
    }
}

public class Class2 {

    public void doWithThing(Class1 o) {
        o.getThing(new Class1.Callback() {
            public void setData(String item1, String item2) {
                ... do something with item 1 and item 2 ...
            }
        });
    }

}

インターフェースはオブジェクトの内部クラスであるため、作成する新しいオブジェクトはなく、余分なクラスも多くありません。

これがSwiftをとても素晴らしいものにします。コードは次のようになります。

o.getThing({ item1, item2 -> Void in
    ... do something with item 1 and item 2 ...
});

そして、唯一の引数はブロックなので、これも:

o.getThing { item1, item2 -> Void in
    ... do something with item 1 and item 2 ...
};

Javaには、コールバックを含むコードを読みやすくするための作業が必要です。

1
Paul Hamilton