像C#中的Java方法事件回调

时间:2015-02-19 10:21:44

标签: java events methods handler

您好我在java中执行tcp服务器,并且我的侦听器类工作但我想在侦听器类初始化时向侦听器类声明一个事件,因此在侦听器类中我可以调用事件newConnection(socket sck)和然后它将再次转到主类并运行绑定到该事件的方法,就像你可以在C#中使用myclass.myevent + =

它可以在java中完成,还是有其他方式arround,我已经看过eventlisteners或者它被调用了什么,但我真的很困惑如何处理它。

关心马丁。

2 个答案:

答案 0 :(得分:2)

您可以这样做:

public interface ConnectionCallback {

    void onConnected(Socket socket);

}

在你的听众课程中:

public class Listener {

    public void connect(ConnectionCallback callback){

        //connect to your server here
        Socket socket ....

        callback.onConnected(socket);
    }
}

在您的主要表单中,或在您创建此侦听器的任何位置:

public class MainForm{


    public void createListener(){

        Listener listener = new Listener();
        listener.connect(new ConnectionCallback() {
            public void onConnected(Socket socket) {

                 //perform custom logic here on the callback socket

            }
        });
    }
}    

编辑:如果你正在考虑使用Java 8,这可能会让你更容易理解你是否通过使用lambdas从C#角度出发:

public class Listener {

    public void connect(Consumer<Socket> socketConsumer){
        Socket socket ....

        socketConsumer.accept(socket);
    }
}

然后,简化了您的MainForm:

public class MainForm {

    public void createListener(){

        Listener listener = new Listener();
        listener.connect(socket -> onConnected(socket));

    }

    private void onConnected(Socket socket) {
        //perform custom logic here...
    }
}

答案 1 :(得分:1)

也许这样的事情会有所帮助: 声明事件侦听器的接口:

public interface InitializationListener {
  public void onInitialize();
}

然后,在应该触发事件的类中:

//Using a List allows more than one listener to be registered
private List<InitializationListener> listeners = new ArrayList<InitializationListener>();

public void addInitializationListener(InitializationListener listener) {
  this.listeners.add(listener);
}

当您想要触发侦听器时,可能在newConnection()中:

public void newConnection(Socket sock) {

  //do stuff..

  //trigger listeners:
  for (InitializationListener listener : listeners) {
    listener.onInitialize();
  }

}

最后,在您的客户端代码中:

server.addInitializationListener(new InitializationListener() {

  public void onInitialize() {
     //do stuff
  }

});