序章
インターフェイス、抽象クラス、およびジェネリックを使用して、Java でかなり複雑な構造を作成しようとしています。ジェネリックの経験がなく、優れた OOP 設計を作成する平均的な経験しかないため、これはかなりの課題になり始めています。
私がやろうとしていることは、実際にはできないかもしれないが、それに十分近づくことができると感じています。できるだけ簡潔に説明しようと思います。この構造は、データベースにアクセスするための DAO およびサービス層を表すことをすぐに説明します。この質問をより抽象的にすると、より難しくなるだけです。
私のDAO層はそのままで大丈夫です。ジェネリック DAO インターフェイスがあり、エンティティごとに、ジェネリックを拡張してジェネリック型を埋める DAO インターフェイスがあります。次に、各 DAO 実装によって拡張される抽象クラスがあり、対応するインターフェイスを実装します。おそらく混乱を招くので、例として製品のDAOを示す図を次に示します。
サービスクラスについても、同様の構造を念頭に置いていました。とにかく、サービス クラスのほとんどのメソッドは DAO メソッドにマップされます。上の図のすべての「DAO」を「サービス」に置き換えると、私のサービス層の基礎が得られます。しかし、私が持っている次のアイデアに基づいて、やりたいことが1つあります。
エンティティのすべてのサービス クラスは、少なくとも 1 つの DAO オブジェクト、つまり、それが設計されたエンティティの DAO にアクセスします。
どちらが...
質問/問題
各サービス クラスがそれぞれのエンティティの DAO オブジェクトのインスタンス変数を 1 つ持つように適切な OO 設計を作成できれば、サービス レイヤーは完璧だと思います。私のデザインが見た目ほど良くない場合に備えて、これに関するアドバイスを歓迎します。
私は次のように実装しました:
クラス AbstractService
public abstract class AbstractService<EntityDAO> {
EntityDAO entityDAO;
public AbstractService() {
entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor
}
abstract EntityDAO makeEntityDAO();
}
クラス ProductServiceImpl
public class ProductServiceImpl extends AbstractService<ProductDAOImpl> {
public ProductServiceImpl() {
super();
}
@Override
ProductDAOImpl makeEntityDAO() {
return new ProductDAOImpl();
}
}
この設計の問題は、私が気に入らないコンパイラの警告です: コンストラクターにオーバーライド可能なメソッド呼び出しがあります(コメントを参照)。現在はオーバーライドできるように設計されており、実際、各サービス クラスが対応する DAO への参照を確実に持つように強制しています。これは私ができる最善のことですか?
私はあなたが必要とするかもしれないすべてを、この質問に必要なものだけを含めるために最善を尽くしました. 私が今言わなければならないのは、コメントは大歓迎であり、さらに広範な回答です。時間を割いて読んでくれてありがとう.