0

私は最近、ドメイン オブジェクトの構成を使用する代わりに、コレクション オブジェクトを拡張する実験を行っています。たとえば、これを使用します。

public class Path extends ArrayList<PathElement> {
}

public static void main(String args[]) {
  Path path = new Path();
  path.add(new PathElement());
}

それ以外の:

public class Path {
  private List<PathElement> pathElements = new ArrayList<PathElement>();

  /* getter/setter*/

}

public static void main(String args[]) {
  Path path = new Path();
  path.getPathElements().add(new PathElement());
}

これは一般的/許容可能な慣行ですか? 欠点やより良い代替手段はありますか? 私が見ることができる 1 つの欠点は、実装を簡単に変更できないことです。たとえば、ArrayList の代わりに LinkedList を使用することはできません。

4

2 に答える 2

2

2番目のアプローチは正しいです。組み込みのデータ構造クラスの動作を変更したり、新しい動作を追加したりしない限り、組み込みのデータ構造クラスを拡張しないでください。

新しい動作を変更または追加した場合でも、ドメインオブジェクトがそれらを拡張してはなりません。代わりに、2番目のコードブロックに示すように、マップまたはリストを拡張する別のクラスを作成し、ドメインオブジェクトで新しいクラスを使用します。

于 2012-06-20T15:26:14.207 に答える
0

あなたのアプローチは間違いなく間違っています。
継承ではなく合成を使用する必要があります。継承はカプセル化を「壊し」、正しく行われないと実装の詳細と結合します。つまり、制御下にあり、拡張用に設計されたクラスのみを拡張する必要があります。そうしないと、トラブルに巻き込まれる可能性があります

于 2012-06-20T15:50:16.897 に答える