Java对象异步完成创建 - 构造函数完成后的某个时间就可以准备好了



我必须将专有的Java API包装成更有用的东西。中央类是"客户端"对象签名就是这样:

public class ProprietaryClient {
    private final IEvents eventHandler;
    private Object one;
    private Object two;
    public ProprietaryClient(ProprietaryClient.IEvents eventHandler){
        this.eventHandler = eventHandler;
    }
    //returns immediately
    public void connect(String url){
        //doing nasty stuff that triigers
        //on success
        //will be called from somewhere at anytime
        // eventHandler.onStateChange( State.CONNECTED );
    }
    //returns immediately
    public void login(String user, String password){
        //doing nasty stuff that sets fields one and two
        //will be called from somewhere at anytime
        //eventHandler.onStateChange( State.LOGGED_IN );
        //eventHandler.onLogin( one, two );
    }
    public interface IEvents {
        void onStateChange(State state);
        void onLogin(Object one, Object two);
    }
    public enum State{
        CONNECTED,
        LOGGED_IN,
        UNKNOWN;
    }
}

此对象仅在状态" logged_in"中有用,但是该字段没有得到的。知道对象是否可用的唯一方法是:

  1. 呼叫连接
  2. 等待状态更改连接
  3. 致电登录
  4. 等待状态更改为logged_in(或Onlogin的呼吁(

我想将其包装成一个类,该类可在构造函数中连接和登录,并告诉用户是否准备就绪。我的想法是拥有一种返回完整未来或将来的方法:这就是我到目前为止的。事件的内容正在以这种方式工作。IEVENT的实现将所有EVANT都包含在用户识别的消息中(此部分正在起作用(。但是如何根据到达事件(带有///的零件???(创建和维护完整的未图有没有办法创建我自己的未来,如果事件到达或满足正确的条件,可以做好准备?

public class MyClient implements Client, MessageHandler {

    private final String password;
    private final IEvents eventHandler;
    private final SubscribableChannel eventBus;
    private final String user;
    private final ProprietaryClient propClient;
    public SikomClient( String user, String password, IEvents eventHandler, SubscribableChannel eventBus) {
        this.eventHandler = checkNotNull( eventHandler );
        this.eventBus = checkNotNull( eventBus );
        eventBus.subscribe( this );
        this.password = password;
        this.user = user;
        propClient = new ProprietaryClient(eventHandler);
        ///????
        propClient.connect("url");
        //have to wait until message received and state is "CONNECT"
        propClient.login(user, password);
    }
    public CompletableFuture<Boolean> amIready(){
        //???
    }
    @Override
    public void handleMessage( Message<?> message ) throws MessagingException {
        if( message instanceof OnClientStateMessage && belongsToMe( message )){
            // ????
        } else if( message instanceof OnLoginMessage && belongsToMe( message )) {
            // ????
            //complete CompletableFuture with true
        }
    }
    private boolean belongsToMe(Message<?> message){
        return ((AbstractStringJsonMessage) message).getUserId().equals( user );
    }
}

或者有更好的方法可以在没有"未来"的情况下解决这个问题。我想给呼叫者责任等待多长时间,但我的班级应该维护状态并了解它。

解决方案很简单。现在我更好地了解"完整的未来"。

我添加了一个登录方法,一个具有可完整的未来的字段a Getter:

private CompletableFuture<ReturnCode> loggedIn = new CompletableFuture<>();
...
private void login() {
    //as per sikom settings each user gets a fixed workplace identified by user name
    if( loggedIn.isDone() ) {
        loggedIn = new CompletableFuture<>();
    }
    propClient.login( user, user, password, 0 );
}
public CompletableFuture<ReturnCode> loggedIn() {
    return loggedIn;
}

我的处理方法是这样做的:

public void handleMessage( Message<?> message ) throws MessagingException {
    if( message instanceof OnClientStateMessage && belongsToMe( message ) ) {
        state = ( (OnClientStateMessage) message ).getState();
        if( state.equals( ClientState.CONNECT ) ) {
            login();
        }
    } else if( message instanceof OnLoginMessage && belongsToMe( message ) ) {
        ReturnCode rc = ( (OnLoginMessage) message ).getRc();
        loggedIn.complete( rc );
    }
}

我只是手动手动完成未来(由于没有任何任务附件,因此永远不会返回(。

该类的用户将实例化,并可以立即致电loggedin。Calle可以决定等待多长时间才能loggedin.get((。

不知道这是一个好主意:班级它可以扩展完整的future并可以完成自己?!

最新更新