3

複数のコンストラクタを持つクラスがあります。それぞれが異なるユースケースを表しています。

public class ABC {
  public ABC(int x) {
  ...
  }
  public ABC(ArrayList<String> Stringarray) {
  ...
  }
  ..many more constructors..
}

Javaコンパイラから同じ消去の問題が発生するまで、コンストラクターのオーバーロードはこれまでのところクリーンなソリューションでした。たとえば、同じ消去を行う別のコンストラクターを追加したいので、以下のように、今のところ回避するためにデフォルトのパラメーターを含めることを選択しました。

public ABC(ArrayList<String> stringArray) {
  …
}
public ABC(ArrayList<Integer> integerArray, boolean… sameErasureFlag) {
  …
}

しかし、おそらく非常に多くのコンストラクターを使用することは、このユース ケースの適切な設計パターンではないのではないかと強く感じています。おそらく、そのようなシナリオに使用されるより良いソリューションまたはベスト プラクティスの設計パターンがあるでしょう。ビルダーパターンを調べていますが、それが正しいかどうかはわかりません。推奨事項はありますか?

4

6 に答える 6

2

コンストラクターが多いのは良いデザインパターンではないのではないかと強く感じています。

場合によります。

コンストラクターを好む人もいれば、他のアプローチを好む人もいますが、オーバーロードされたコンストラクターが多数あると、読み取りと保守が面倒になる可能性があるというのは正しいと思います。

考慮すべき 1 つの代替手段は、Static Factory Methods. 最近、多くの著者が、コンストラクターよりも静的ファクトリー メソッドを優先することを提案しています。

それらを優先する理由はいくつかあります。

それらはより良く、よりクリーンで、より直感的な可読性を提供します

コンストラクタに名前を付けることはできません。コンストラクター名は常にクラス名と同じです。ただし、名前を使用すると読みやすくなるため、名前を使用すると便利な場合があります。

サブタイプを構築して返すことができます

コンストラクターを使用する場合、構築されたオブジェクトの型を変更することはできません。ただし、ファクトリ メソッドはスーパー クラスから派生したオブジェクトを返すことできます。つまり、入力基準に応じて、何を構築するかを正確に決定できます。

于 2021-03-19T12:16:39.073 に答える