0

ここでは Java の初心者です。これが私がやりたいことです:

  1. それぞれが同じスーパークラスを拡張するクラスのリストを列挙します。
  2. イベントに興味があるかどうかクラスに尋ねます。
  3. クラスが必要な場合は、クラスをインスタンス化し、オブジェクトのイベント ハンドラーを呼び出します。

アイデアは、ステップ 2 と 3 によって、関心のないクラスのインスタンス化が防止されるというものです。ただし、インスタンス化の前にメソッドを呼び出しているため、チェックは静的に行う必要があります。Java では (当然のことながら) 静的メソッドのオーバーライドが許可されていないため、手順 2 でクラスをインスタンス化して、シーケンスを次のようにする必要があるようです。

  1. それぞれが同じスーパークラスを拡張するクラスのリストを列挙します。
  2. 各クラスをインスタンス化し、イベントに関心があるかどうかをオブジェクトに尋ねます。
  3. オブジェクトが必要な場合は、そのイベント ハンドラーを呼び出します。興味がなければ捨ててください。

最初の一連の手順を実行するための一般的な方法がありませんか?

この質問はほとんど理論的なものであることに注意してください。オブジェクト作成のオーバーヘッドは、それを意味のないものにするのに十分低いかもしれません。しかし、私はその可能性に興味があります。

4

1 に答える 1

1

理論について話しているので、いくつかの事実を指摘し、設計の観点から話しています。

静的メソッドはクラスの特定のインスタンスに関連付けられていないため、インスタンスを持つことに依存するため、オーバーライドはオプションではありません。クラスメソッドのオーバーライドを許可する他のいくつかの言語を思い出すので、私はJavaについて話している.

これを回避するには、対象のイベントを返す静的メソッドを各サブクラスで定義することです。これにより、インスタンス化の前にこのデータを知ることができます。

もう 1 つのオプションは、これらのオブジェクトのインスタンス化を担当する特定のクラスを配置し、そのクラスに、イベントを関心のあるクラスのリスト (初期化および構成できるテーブル) に関連付けるテーブルを保持させることです。このアプローチは、イベントからクラスを登録解除する場合にコードを変更する必要がないため、より保守しやすいようです。

最後に、特定のイベントに関連付けられているすべてのクラスをインスタンス化するだけです。

public class EventClassCreator {
    private Map<String, List<String>> subscriptions;

    public EventClassCreator() {
        subscriptions = new HashMap<String,Set<String>>();
    }

    public void addSubscription(String event, String class) {
        if(subscriptions.containsKey(event))
            subscriptions.get(event).add(class);
        else {
            Set<String> subscriptionsForEvent = new HashSet<String>();
            subscriptionsForEvent.add(class);
            subscriptions.put(event, subscriptionsForEvent);
        }
    }

    //You just need to make an event that loops over the list of classes, 
    //checks a subscription and instantiates a class if it is in the 
    //proper list.
}
于 2012-11-03T21:50:09.957 に答える