これに対するエレガントな解決策を見つけようとしていますが、わかりません。
私はどこかに汎用データプロバイダーを持っています。私はそれを呼び出して任意のオブジェクトを取得したいと思います-そして、リクエストに応じて、キャッシュ、サーバーなどからそれらを取得します。
たとえば、次のように呼び出します。
List<Customer> customers = new DataProvider().getData(new CustomersRequest(20));
これにより、すべての顧客に 20 歳が提供されます。DataProvider は、このデータを取得する方法と場所を決定します。
CustomersRequest は Request クラスを拡張します。
これを機能させるには、getData で Request インスタンスの instanceOf チェックを行い、DB キャッシュまたはリモート プロバイダーから対応するメソッドを呼び出す必要があります。次のようなものです。
if (request instanceof CustomersRequest) {
DBDataProvider dbDataProvider = new DBDataProvider();
List<Customer> customers = dbDataProvider.getCustomers(request);
if (customers == null) {
RemoteDataProvider removeDataProvider = new RemoteDataProvider();
customers = removeDataProvider.getCustomers(request);
if (request.cacheInDB) {
//save response to db
}
return customers;
}
}
しかし、それはこのメソッドから を返す場合にのみ機能Object
します。これは、呼び出すたびにキャストを行うことになります。私はこれが適切な解決策だと思いますが、返されたデータは内部で行うキャストにも基づいているためです。
そしてのインスタンスは悪いと言われています。
これをジェネリックで解決する方法が見つかりませんでした。
私もできる:
List<Customer> customers = new DataProvider().getCostumers(20);
しかし、これは、すべての異なるオブジェクトとパラメーターに対して、DataProvider で多くのメソッドを作成する必要があることを意味し、これらのメソッドのそれぞれで、キャッシュ チェックなどを行う共通のメソッドを呼び出す必要があります。この一般的な方法では、最初のアプローチと同じ問題があります。
またはまた:
List<Customer> customers = new CustomersDataProvider().getCostumers(20);
ここでは、ジェネリックではないため、インスタンスとジェネリックに問題はありません。しかし、考えられるすべてのデータに対してキャッシュ アクセスと検証を 1 か所で取得するために、これを正しく抽象化できるかどうかはわかりません。
これに対する最善のアプローチは何ですか?