1. ホーム

[解決済み】セッターが "this "を返すのはバッドプラクティスか?

2022-04-15 05:09:57

質問

javaでセッターが "this"を返すのは良いアイデアですか悪いアイデアですか?

public Employee setName(String name){
   this.name = name;
   return this;
}

このパターンは、次のようにセッターを連鎖させることができるので便利です。

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));

ではなく、このように

Employee e = new Employee();
e.setName("Jack Sparrow");
...and so on...
list.add(e);

...しかし、それは標準的な慣習に反しているようなものです。セッターに何か他の便利なことをさせることができるというだけで、価値があるのかもしれませんね。このパターンが使われているのを見たことがありますが(JMockやJPAなど)、一般的ではなく、このパターンがどこでも使われているような、非常によく定義されたAPIにのみ使われているようです。

更新しました。

私が説明したことは明らかに有効ですが、私が本当に求めているのは、これが一般的に受け入れられるかどうか、また、落とし穴や関連するベストプラクティスがあるかどうかについての考えです。私はBuilderパターンについて知っていますが、私が説明しているものよりももう少し複雑です。Josh Blochが説明しているように、オブジェクトを作成するために関連する静的なBuilderクラスがあります。

解決方法は?

特に問題はなく、スタイルの問題だと思います。 こんな時に便利です。

  • 一度に多くのフィールドを設定する必要がある(構築時を含む)
  • コードを書いている時点で、どのフィールドを設定する必要があるか分かっている場合。
  • どのフィールドを設定するかは、さまざまな組み合わせがあります。

この方法の代替案としては、以下のようなものが考えられます。

  1. 1つの巨大なコンストラクタ(欠点:多くのヌルやデフォルト値を渡す可能性があり、どの値が何に対応するかを知るのが難しくなる。)
  2. オーバーロードされた複数のコンストラクタ(欠点:いくつもあると扱いにくくなる)。
  3. ファクトリー/スタティックメソッド(デメリット:オーバーロードされたコンストラクタと同じで、数が多くなると扱いにくくなります。)

一度に数個のプロパティを設定するだけなら、'this'を返す価値はないと言える。 後で何か他のもの、例えばステータスや成功のインジケータやメッセージを返すことにした場合、確かにそれは失敗する。