0

より説明的になるように質問のタイトルを変更する方法について提案がある場合は、お気軽にお知らせください。

オブジェクトを返すクラス メソッドがあるとします。メソッド内でオブジェクトを作成するためのベスト プラクティスまたは標準的な方法はありますか? 明確にするために、以下を参照してください。

public MyCustomObject myMethod(String arg1, String arg2){
    try{
        if (something){
            ...
        } else {
            ...
        }
    } catch ( SomeException e ){
        ...
    } catch ( SomeOtherException e ){
        ...
    }

    return myCustomObject;
}

MyCustomObject には、空のコンストラクター、5 つのフィールドとゲッター/セッターを持つコンストラクターがあります。上記の (簡略化された) フローのすべてのケースで、有効な MyCustomObject を返す必要があります。制御フロー自体に注目しないでください。

私は次のいずれかができると思います: a) MyCustomObject 型の変数をメソッドの先頭に null で初期化します。制御フローのさまざまなケースごとに、新しい MyCustomObject をそれに割り当てます。最後に返してください。b) 空のコンストラクターを使用して、最初に MyCustomObject をインスタンス化します。フロー内の各ケースのセッターを使用してオブジェクトを変更します。

上記のいずれかまたは別の方法が望ましい理由を考えていただけますか?

ありがとう

4

4 に答える 4

2

あなたが言及しなかったオプション 3 を好みます。制御フローのさまざまなケースごとに新しい MyCustomObject を作成し、すぐに返します。変数は必要ありません。通常は次のとおりです。

if (foo) {
    return new MyCustomObject("foo");
}
if (bar) {
    return new MyCustomObject("x", "y");
}
// etc

これは通常、ネストが少なくなり、returnステートメントをヒットするとすぐに完了するため、読みやすくなります。

一部の人々は、出口点が 1 つしかないという定説に固執していますが、最近ではそれはやや無意味だと思います。戻る前にクリーンアップを行う必要がある言語では意味がありましたが、ガベージ コレクションとfinally他のリソースのブロックがありました。クリーンアップ、それは不要です。

できるだけ早く戻ると、多くの場合、コード内のネストが少なくなり、可読性が大幅に向上します。

于 2012-10-20T18:21:18.260 に答える
0

だからどちらか:

MyCustomObject result = null;
if (something) {
    result = new MyCustomObject(a, b, c, d, e);
} else {
    result = new MyCustomObject(a, b, x, y, z);
}

または

MyCustomObject result = new MyCustomObject();
if (something) {
    result.Name = arg1;
} else {
    result.Phone = arg2;
}

return result;

なぜ私がどちらかを選ぶべきなのか本当にわかりません!結果の初期化を忘れないようにするために、おそらくBを使用します...しかし、それは私が思うにほとんど理由がありません。

于 2012-10-20T18:15:21.763 に答える
0

私の仕事では、個人的に最初の方法を好みます(つまり、戻り変数を宣言し、に割り当ててからnull、プログラムの実際のロジックで必要に応じて適切なオブジェクトをインスタンス化できるようにします)。

これがより便利だと思う理由は、メソッドを呼び出す場所がどこであっても、オブジェクトの作成で問題が発生したかどうか、または有用なオブジェクトが作成されたかどうかを知りたいからです。インスタンス化されたオブジェクトがダミーオブジェクトであるかどうかを判断するよりも、nullチェックを実行する方がはるかに簡単です。nullチェックは通常、複雑なプログラムの制御フローの大部分を占めることがわかります。何が起こっても、常にオブジェクトを返す場合、チェッカーはもっと複雑になる必要があります。

たとえば、カスタムオブジェクトreadItem()を返すというメソッドがあるとします。ItemこのreadItem()場合、テーブルからデータを取得してデータを入力Itemします。readItem()さて、例外をスローする令状の処理に何も問題がないとしましょう。しかし、Item読み取りたい基準がテーブルにないだけです(たとえば、アイテムが存在しないアイテムIDなどを指定した場合などです。 )。Item次に、ではなくインスタンス化されたものを返すとnull、これを理解するのははるかに困難になります。

于 2012-10-20T18:15:47.193 に答える
0

オプション1:

MyCustomObject myCustomObj = null;

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}

完璧:変数を一度宣言し、値を変更しています。

オプション2:

for( index > list of cases ){

    MyCustomObject myCustomObj = myMethod(param1, param2);

}

良い例:変数を何度も再宣言し、値を変更しています。

オプション3:

MyCustomObject myCustomObj = new MyCustomObject();

for( index > list of cases ){

    myCustomObj = myMethod(param1, param2);

}

悪い例:参照がどこにも使用されていないため、最初の行でメモリを浪費していますが、それでも害はありません

于 2012-10-20T18:15:58.263 に答える