これは私のコースでは扱われておらず、これが必要な理由を考えるのに苦労しています. 私は以下のコードに出くわしました:
OpenNetworking proxy = service.getPort(OpenNetworking.class);
上記の行では、ポートを返し、クラスをメソッドに渡していることがわかりますが、OpenNetworking.class
まだインスタンス化されていないため、これを読みました。私は明らかに何かが欠けています。
これは私のコースでは扱われておらず、これが必要な理由を考えるのに苦労しています. 私は以下のコードに出くわしました:
OpenNetworking proxy = service.getPort(OpenNetworking.class);
上記の行では、ポートを返し、クラスをメソッドに渡していることがわかりますが、OpenNetworking.class
まだインスタンス化されていないため、これを読みました。私は明らかに何かが欠けています。
これはFactory メソッドパターンの例です。
Port
クラス タイプは、指定されたタイプを提供するためにサービスに提供されますOpenNetworking
。
この場合、クラス型は、オブジェクトの作成時にオブジェクトに一意の識別子を提供する最も簡単な方法であるため便利です。class
にオブジェクトのタイプが含まれているため、オブジェクトの状態が変化した場合は、維持する必要はありません。
これには多くの理由が考えられます:
- クラスのインスタンス数の制御: クラスに必要なインスタンスの数を制御したいとします。コンストラクターをプライベートまたはパッケージ レベルにして、誰かがメソッドを呼び出したときに同じインスタンスを返すことができます。
- セキュリティ: クラスを安全にする必要があり、通常はクラスのインスタンス化を誰にも許可したくない場合があります。
- 依存関係: クラスには、実行時にのみ把握できる依存関係がある可能性があり、サービス クラスはリフレクションを使用してクラスを適切にインスタンス化します。
ここでは、クラス タイプ (Java のクラス) を渡しています。したがって、メソッド getPort での処理はクラスのタイプに基づいて行われます。これを処理するために Object インスタンスは必要ありません。もちろん、次のコードとは異なります (コンパイルされません)。
OpenNetworking proxy = service.getPort(new OpenNetworking());
使用されるメソッドには次の定義があります。
public <T> T getPort(Class<T> serviceEndpointInterface)
したがって、クラス T を拡張するオブジェクトのインスタンス (プロキシ、合成クラス インスタンス) を返します。
また、ジェネリックの制限により、ジェネリック クラス/メソッドがあり、新しいインスタンスを作成する必要がある場合は、クラスが必要になります。例えば:
class SomeClass<T> {
public static<T> T create() {
return new T(); // will not work
}
public static<T> T create(Class<T> clazz) {
return clazz.newInstance(); //will work
}
}
したがって、そのタイプの新しいオブジェクトを作成するには、クラス インスタンスが必要です。
どうやら、メソッドservice.getPort();
はパラメーターのタイプに従って動作するようです。openNetworking 用のポートと closeNetworking 用の別のポートがあると想像してください。そのため、必要なポート番号を取得するには、クラス名をパラメーターとして指定するだけで十分です。列挙型を作成できます。ただし、既存のコードを拡張すると、型ごとに列挙も拡張する必要があります。