Java - 具有返回值的异步方法

时间:2012-10-01 20:06:45

标签: java asynchronous casting

我对java中的异步方法调用有疑问,特别是关于异步方法的响应值。

情况如下:

我要调用的异步方法是..

public void getSpeed(IResponseListener listener) {
....
}

听众的界面是......

interface IResponseListener {
    public void response(ResponseEvent event);
}

当async方法具有响应值

时,将调用此方法

我现在的问题是,类ResponseEvent的属性response可以是任何类型(boolean,float,String...),并且在接口IResponseListener的实现中我必须施展价值......

IResponseListener listener = new IResponseListener {

    public void response(ResponseEvent event) {
        float f = (float)event.response;
    }
}

这是一个很好的解决方案吗?我认为不好的是响应监听器必须知道响应的类型! 是否有更好的解决方案来处理即使响应可以是任何类型也希望给出响应的异步调用?

4 个答案:

答案 0 :(得分:2)

我认为很多这些答案开始看起来像这样 - >

public interface Function<Args, Value>
{
  public Value call(Args args);
}

你的返回类型无关紧要 - 如果它可以返回多种类型,那么“多种类型”就是一种类型......考虑到你正在看什么,我可以推荐一种JSON吗?

现实是你不能指望你的处理程序事先知道类型,所以你需要指定它。无论是返回类型还是类,都取决于你。

我很容易看到做一个类层次结构:

public class ResponseString implements Function<Args, String>; 
public class ResponseNumber implements Function<Args, Number>;
...
public class ResponseType implements Function<Args, Type>;

或者只是创建一个包含您需要的所有信息的类型。长期和短期是该方法可以定义它对类型的期望,并且您有能力扩展它们。请记住,响应也可以是可以执行的功能。知道如何处理某些事情而不知道它是什么并没有错 - &gt;

例 - &GT;

//Admittedly I'd probably have a "Procedure or VoidFunction interface as well".
public yourMethod(Function<String args, Function<String,?> handler)
{
  String hello = "hello";
  Function<String,?> function = handler.call(hello);
  function.call(hello); 
} 

我希望这会有所帮助。有时候没有理由去这么远,有时也有。你不知道这种类型 - 似乎你希望别人能提供它,这可以为你做到,同时保持严格。

编辑:   在一个框架中有这个的例子是:

  Applcation.openDialog(Dialog dialog, Callable<Boolean> onClose);

返回true,对话框清理并关闭,否则返回false。我真的不在乎这里发生了什么,我关心它告诉我是,关闭它,或者不关心它。

答案 1 :(得分:1)

使用Java泛型:

interface IResponseListener<T> {
    public void response(T response);
}

然后,在匿名课程中:

IResponseListener listener = new IResponseListener<Float> {

    public void response(Float response) {
        float f = response;
    }
}

答案 2 :(得分:1)

我不知道这是否正确,但如果您要以不同方式处理返回值,为什么不使用您期望的不同类型的对象重载响应方法。只是一个建议..

interface InterfaceName{
    void response(float responseVal);
    void response(boolean responseVal);
    ...
}

答案 3 :(得分:0)

我会这样做@nico_ekito说...或者使用你现有的解决方案。这是一个你不知道结果类型的问题。

无论如何,你可以做一些调整,让ResponseEvent类为你做转换。

<强> ResponseListener.java

interface IResponseListener {
    void response(ResponseEvent event);
}

<强> ResponseEvent.java

public class ResponseEvent {

   private Object response;

   @SuppressWarnings("unchecked")
   public <T> T getResponse() {
       return (T)response;
   }

   public <T> void setResponse(T response) {
       this.response = response;
   }
}

<强>用法:

IResponseListener listener = new IResponseListener() {
    public void response(ResponseEvent event) {
        float f = event.getResponse();
    } 
};

请注意,如果您的类型不是您期望的类型,您将获得ClassCastException