12

というタイプがあるとしましょうSuperstarSuperstarここで、いくつかの作業を行い、オブジェクトのいくつかのプロパティを編集するメソッドが必要です。

これを実装する方法の 2 つの方法を次に示します。方法 1 は次のようになります。

private Superstar editSuperstar(Superstar superstar){
    ....
    superstar.setEdited(true);
    return superstar;
}
...
superstar = editSuperstar(superstar);

方法 2 は次のようになります。

private void editSuperstar(Superstar superstar){
    ....
    superstar.setEdited(true);
}
...
editSuperstar(superstar);

これら 2 つの可能な方法のうち、「ベスト プラクティス」と見なされるのはどれですか? 最初のもの、または2番目の疑似「参照による」もの?

4

5 に答える 5

6

あなたの場合、スーパースター プロパティ ( edited) の 1 つを直接変更するため、2 番目の形式が適しています。ただし、スーパースター オブジェクトを使用し、その更新されたバージョンを (最初のオブジェクトを変更せずに) 返すメソッドがある場合は、最初の形式が優先されます。

最後に、この例はどちらも Superstar オブジェクトのみを使用しているため、Superstar クラスのメンバー メソッドである必要があります。

于 2010-07-15T08:05:52.903 に答える
4

最初の形式は欺瞞的です。1 つのオブジェクトが渡され、それがコピーされ、コピーが変更されて返されるという印象を与えます。

「ベスト プラクティス」は、最初の形式を使用することですが、実際には暗示されていることを実行します (コピーに変更を適用し、それが返されます)。不変オブジェクトは、コピーにコストがかかる大きな分厚いものでない限り、一般に可変オブジェクトよりも優先されます。その場合は、2 番目の形式を優先する必要があります。

于 2010-07-15T08:07:24.913 に答える
4

呼び出しをチェーンする予定の「ビルダー」クラスを作成する場合を除き、方法 2 を使用します。元:

MyClass c = (new MyClassBuilder()).setX(blah).setY(blah).build();
于 2010-07-15T08:06:04.983 に答える
2

最初の方法でここにある問題は、次のように使用する場合です。

Superstar edited = editSuperstar(originalSuperstar);

これは、私の意見では直感に反する元のスーパースターも変更します...

したがって、渡されたオブジェクトを変更する場合は 2 番目のものを、オブジェクトの新しいコピーを返す場合は最初のものを優先します。

この奇妙な例では、編集メソッドを Superstar クラスに追加するだけで済みます...

于 2010-07-15T08:12:00.027 に答える
1

一部のフィールドのみを変更した同じインスタンスを返す場合、最初の形式は API クライアントにとって驚くべきものです。元のインスタンスを変更せずに、変更されたコピーを取得することが期待されます。

したがって、コピーを返さない場合は 2 番目の形式を使用し、返す場合は最初の形式を使用します (Superstarその場合は不変にすることを検討してください)。

于 2010-07-15T08:12:58.720 に答える