4

これは私のコースでは扱われておらず、これが必要な理由を考えるのに苦労しています. 私は以下のコードに出くわしました:

OpenNetworking proxy = service.getPort(OpenNetworking.class);

上記の行では、ポートを返し、クラスをメソッドに渡していることがわかりますが、OpenNetworking.classまだインスタンス化されていないため、これを読みました。私は明らかに何かが欠けています。

4

6 に答える 6

3

これはFactory メソッドパターンの例です。

Portクラス タイプは、指定されたタイプを提供するためにサービスに提供されますOpenNetworking

この場合、クラス型は、オブジェクトの作成時にオブジェクトに一意の識別子を提供する最も簡単な方法であるため便利です。classにオブジェクトのタイプが含まれているため、オブジェクトの状態が変化した場合は、維持する必要はありません。

于 2013-04-11T10:57:07.960 に答える
2

これには多くの理由が考えられます:

  1. クラスのインスタンス数の制御: クラスに必要なインスタンスの数を制御したいとします。コンストラクターをプライベートまたはパッケージ レベルにして、誰かがメソッドを呼び出したときに同じインスタンスを返すことができます。
  2. セキュリティ: クラスを安全にする必要があり、通常はクラスのインスタンス化を誰にも許可したくない場合があります。
  3. 依存関係: クラスには、実行時にのみ把握できる依存関係がある可能性があり、サービス クラスはリフレクションを使用してクラスを適切にインスタンス化します。
于 2013-04-11T11:03:08.587 に答える
1

ここでは、クラス タイプ (Java のクラス) を渡しています。したがって、メソッド getPort での処理はクラスのタイプに基づいて行われます。これを処理するために Object インスタンスは必要ありません。もちろん、次のコードとは異なります (コンパイルされません)。

OpenNetworking proxy = service.getPort(new OpenNetworking());
于 2013-04-11T10:54:56.373 に答える
0

使用されるメソッドには次の定義があります。

public <T> T getPort(Class<T> serviceEndpointInterface)

したがって、クラス T を拡張するオブジェクトのインスタンス (プロキシ、合成クラス インスタンス) を返します。

于 2013-04-11T11:04:59.717 に答える
0

また、ジェネリックの制限により、ジェネリック クラス/メソッドがあり、新しいインスタンスを作成する必要がある場合は、クラスが必要になります。例えば:

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
    }
}

したがって、そのタイプの新しいオブジェクトを作成するには、クラス インスタンスが必要です。

于 2013-04-11T11:02:10.237 に答える
0

どうやら、メソッドservice.getPort();はパラメーターのタイプに従って動作するようです。openNetworking 用のポートと closeNetworking 用の別のポートがあると想像してください。そのため、必要なポート番号を取得するには、クラス名をパラメーターとして指定するだけで十分です。列挙型を作成できます。ただし、既存のコードを拡張すると、型ごとに列挙も拡張する必要があります。

于 2013-04-11T10:57:44.813 に答える