タイトルがこの正義を行うかどうかわからない。私はJavaにはまったく新しく、単一のクラスに異なる "サービス"を使用させる方法を理解しようとしています。私がAPIRequestクラスを持っているとしましょう。このクラスは、必要なものに応じて異なるAPIを使用できる必要があります。例。パッケージを発送する必要があります。パッケージが32OZ未満の場合はEndiciaを使用する必要があります。そうでなければFedExを使用する必要があります。私は2つの "サービス"クラスFedexRequestとEndiciaRequestを持っています。私は、APIRequestクラスがパッケージの重量に応じてどちらかを使用できるようにしようとしています。 getServiceという静的メソッドを持つAPIServiceというクラスを作成しました。それは単なる文字列名のマップを作成します。 - >要求クラスのようなので...返され、javaで別のクラスを使用する
public class APIService {
private static Map<String, Object> services = new HashMap<>();
private static final Map<String, String> availableServices = new HashMap() {{
put("fedex", "FedexRequest");
put("endicia", "EndiciaRequest");
}};
public static Object getService(String type) {
if(services.containsKey(type)) {
return services.get(type);
}
return null;
}
static {
for(Map.Entry<String, String> serv : availableServices.entrySet()) {
try {
Class<?> cls = Class.forName(serv.getValue());
services.put(serv.getKey(), cls.newInstance());
} catch(Exception e) {
services.put(serv.getKey(), new Class[1]);
}
}
}
}
だから今はAPIService.getService(「フェデックス」)を呼び出すことができます。しかし、私は...私のような何かをする必要がありますので、私のAPIRequestクラスでそれを使用する方法を把握しようとしている
this.service = (FedexRequest) APIService.getService("fedex");
//or
this.service = (EndiciaRequest) APIService.getService("endicia);
を本当に苦労していますが、それは式の全体の動的な部分を壊し、後で別のサービスを追加する必要がある場合はどうすればよいですか? 私は
this.service = (Request) APIService.getService("fedex");
を使用し、その後、FedexRequestとEndiciaRequest両方がリクエストインターフェイスを実装した試みたが、それが要求にキャストすることはできないと言ってくれのjava.lang.Classエラーが発生します。これは、Requestがインタフェースであるため、実装クラスでcls.newInstance()を使用してインタフェースにキャストできないためです。
私は実際にAPEXequestクラスがFedexRequestまたはEndiciaRequestを使用できるようにする方法を失っています。これは型キャストを特に使用することなく、動的になり、後でサービス全体を記録せずにサービスを追加することができます。私はPHPから来ていますが、明示的に型を定義する必要がないので、これは非常に簡単です。どんな助けでも大歓迎です。ありがとうございました。
https://en.wikipedia.org/wiki/Strategy_pattern – Nahum
あり、あなたのアプローチにはいくつかの問題がありますが、最も直接的なあなたはスーパータイプを定義する必要があることであると思われる(例えば、 '全てのあなたの実装タイプ( 'class FedexService implement ApiService')のためのインタフェースApiService')を提供します。 – chrylis
クラスをキーとして使用し、getServiceでいくつかのジェネリックを使用する必要があります。 'public static T getService(クラスタイプ){'またはそのようなもの –