ホームページ  >  記事  >  Java  >  Java がイベント駆動型メカニズムを実装する方法の例

Java がイベント駆動型メカニズムを実装する方法の例

黄舟
黄舟オリジナル
2017-09-05 10:13:312192ブラウズ

この記事では主に Java を使ったイベント駆動機構の実装を紹介します。編集者がそれを参考にさせていただきます。エディターに従って見てみましょう

プロジェクトの要件により、C# と同様のイベントおよびデリゲート メカニズムを実装できる Java のイベント駆動メカニズムをサポートするクラス ライブラリのセットを提供する必要があります。誰もが知っているように、Java 言語自体とその標準ライブラリは、Swing には関連するクラスがありますが、イベント駆動メカニズムに関連するインターフェイスを提供しません (一般的に誰も使用しないため、標準ライブラリには属さないと思います) :) このメカニズムをサポートしてコンポーネントを実装しますが、結局のところ GUI と結合しているため、他の種類のアプリケーションで使用するには少し扱いに​​くく、汎用性に欠けるようです。したがって、ユニバーサル Java イベント ドリブン メカニズムのクラス ライブラリを実装し、それをユニバーサル Java アプリケーションに適用する必要がありますが、これは難しいことではありません:)

まず、C# イベント ドリブン メカニズムの記述方法を調べてみましょう。 C# で提供されるイベント キーワードを簡単に使用してイベントを定義し、イベント処理関数をイベントに追加することで (C# では、関数の参照には通常デリゲートが使用されます)、関連する処理を呼び出すことができます。イベントがトリガーされると、関数はイベント駆動型のプロセスです。例:


//定义事件和对应的委托
public event MyDelegate Click;
public delegate void MyDelegate();

//定义委托
void OnClick(){
  console.writeline("you just clicked me!");
}

//将委托与事件关联
Click += OnClick;

//触发事件
Click();

上記のコードは、C# で実装されたイベント駆動メカニズムの簡単な例です。これは、C# によって言語レベルで提供される利便性によるものであることがわかります。実際には CLR)。残念ながら、Java にはそのような利便性はなく、人間が実装する必要があります。次の記事では、イベント駆動型メカニズムを実装するための 2 つの方法を参考として提供します。

オブザーバー パターン

オブザーバー パターンは、一般的に使用されるデザイン パターンです。オブザーバーは最初に監視対象オブジェクト (サブジェクト) をサブスクライブします。そのため、監視対象オブジェクト (サブジェクト) で何かが変更されると、オブザーバーに通知されます。変化の。

この設計パターンは、イベント駆動型メカニズムに使用できます。イベントがトリガーされると、イベント処理関数 (デリゲート) が呼び出されることがわかります。 C#) はオブザーバーとして見ることができます。したがって、上記の機能は次のように実装できます。


/*事件类*/
public Event {
  //与事件相关的事件处理函数
  public ArrayList<Callback> callbackList;
  
  //事件触发函数
  public void emit(){
    for(Callback cb : callbackList){
      cb.run();
    }
  }
  
  //注册事件处理函数
  public registerCallback(Callback cb){
    callbackList.add(cb);
  }
}

/*事件处理函数类*/
public interface Callback {
  void run();
}

public OnClick implements Callback {
  //函数
  public void run(){
    System.out.println("you just clicked me!");
  }
  
  
/*实现事件驱动*/
Event e = new Event(); 
//将OnClick事件处理函数注册到事件中
e.registerCallback(new OnClick()); 
//触发事件
e.emit();

上記の Java コードは、単純なイベント駆動メカニズムを実装しています。原理は非常に単純で、オブザーバー パターンの典型的な適用例です。

リフレクションの使用

Java 言語は、実行時にクラスのさまざまなコンポーネント (クラス名、クラス メンバー関数、クラス属性など) を取得して操作できる強力なリフレクション関数を提供します。以下では、単純なイベント駆動メカニズムを実装するためにリフレクションを使用します。


/*事件处理类*/
public class EventHandler {
  //事件源
  private Object sender;
  //事件处理函数名称(用于反射)
  private String callback;
  
  public EventHandler(Object sender, String callback){
    this.sender = sender;
    this.callback = callback;
  }
  
  //事件触发
  public void emit(){
  Class senderType = this.sender.getClass();
  try {
    //获取并调用事件源sender的事件处理函数
    Method method = senderType.getMethod(this.callback);
    method.invoke(this.sender);
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}


/*事件源*/
public class Button(){
  /*可以在此设置Button类的相关属性,比如名字等*/
  private String name;
  ...
  
  
  //事件处理函数
  public void onClick(){
    System.out.println("you just clicked me!");
  }
}
  
  
/*实现事件驱动机制*/
Button b = new Button();
if(/*收到按钮点击信号*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

上記のコードは、リフレクションを使用して実装されたイベント駆動型メカニズムを示しています。リフレクション メカニズムを使用する利点は、強力なスケーラビリティがあることです。たとえば、私のイベント処理関数は EventArgs 仮パラメーターを導入できることです。イベントにはパラメーターがあり、イベントがより多くの情報を伝達できるようにします。書き換えられたイベント処理関数は次のコードに示されています。


public class EventArgs {
  //参数
  String p1;
  Integer p2;
  ...
  
}

//onClick事件处理函数改写
public void onClick(Object sender, EventArgs e){
  //参数e提供更多的信息
  System.out.println("Hello, you clicked me! " + e.p1 + e.p2);
}

//触发函数emit改写
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
  //获取并调用事件源sender的事件处理函数
  Method method = senderType.getMethod(this.callback, this.getClass(), e.getClass());
  method.invoke(this.sender, this.sender, e);
  } catch (Exception e2) {
    e2.printStackTrace();
  }
}

そう、C# で Winform フォームを書くときに Visual Studio が自動生成してくれるイベント処理関数 (コード中の onClick 関数) もほぼ同じ形式ですが、今回は Java で実装します。

もちろん、Java のイベント駆動機構を実装できる上記の 2 つの方法以外にも、Java の内部クラスを使用するなどの他の方法もあります。著者はいくつかのサンプル コードも書いているため、ここでは説明しません。これ以上くどくど言う必要はありません。後ほどお任せします。

以上がJava がイベント駆動型メカニズムを実装する方法の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。