6

というクラスがありServer、他の人がそれを書くことを許可したいとしましょうPlugins。単一のメソッドPluginを拡張Runnableおよび追加するインターフェースであるとします: void init(...). データを収集してサーバーに送信するのはプラグインの仕事です。しかし、サーバーにデータを送信するときが来たら、どのようにこれを行うのでしょうか? C および C++ から来て、関数ポインターの線に沿った考え方を探しています。Java標準クラスライブラリ以外の例は見つかりませんでしたが、Javaでは可能のようです。

メソッド参照をメソッドに渡しinitPluginプラグインがデータを送信したいときにいつでもメソッドを呼び出すにはどうすればよいですか? 今のところ、必要なサーバー メソッドは次のとおりvoid sendData(Integer data)です。

例えば:

// Inside Server
Plugin p = new PluginImplementation();
p.init(this::sendData);    

// Plugin init
public void init(?? sendMethod) {
    storedSendMethod = sendMethod;
    // ...
}

// Plugin run
public void run() {
    // ...
    storedSendMethod(x) // Sends data to server
    // ...
}
4

5 に答える 5

0

Java 8 にはメソッド参照がありますが、オブジェクト全体を渡して sendData() メソッドを呼び出すことができます。「プラグイン」の状況では、それぞれにインターフェースを使用すると、プラグインとサーバーの結合が「より緩い」ものになります。

public interface Server {
    void setData(...);
}

public class MyPlugin implements plugin {

   private Server server;   

   void init(Server s )  {
       this.server = s;
   }

   void run() {
      ...
      this.server.setData(...);
      ...
   }

}
于 2015-08-27T03:25:44.510 に答える
0
interface Server{
  ...
  void sendData(String message);
}

プラグインは関数参照を必要としません。サーバー インターフェースを使用してプラグインにそのメソッドを知らせることができます。

class PluginX implements Plugin{
    ...
    private Server server;
    void init(Server server) {
        this.server = server;
    }

    public void run() {
    // ...
        server.sendData(x) // Sends data to server
    // ...

} }

于 2015-08-27T03:25:50.820 に答える