2009-04-23 62 views
2

我正在设计一个API(使用Java),并希望用户可以从Matlab访问API。问题是,我想要的API提供像一块的功能:Matlab/Java API回调

javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test); 

我的API(在背景中)得到的Java Obj实例的保持(通过某种机制,例如轮询)。我想要这个API方法阻塞,直到这些实例中的一个传递给Predicate时,其计算结果为true。如果我从Java调用这个API,我会这样做:

javaApi.waitUntilPredicateIsTrue(new Predicate<JavaObj>() { 
    public boolean evaluate(JavaObj jo) { 
     return "READY".equals(jo.getState()); 
    } 
}); 

你明白了。

这怎么可以从Matlab内部调用?我可以使用Matlab的匿名内部类吗?我可以声明一个Matlab classdef它扩展了接口Predicate(这可以处理Java通用版本)吗?

回答

2

这听起来像一个棘手的问题。我仍在运行R2006b,所以这可能已经改变了,但看起来MATLAB不会将函数句柄(包括匿名函数)和结构转换为Java对象。我不知道MATLAB自定义类,因为语法已经改变。字符串,数组和单元阵列will translate properly。他们根本没有评论实现接口。 (:p:p:p BOO HISS)

编辑:刚刚在Matlab Central上发现了这个页面,它讨论了一些未公开的接口。

1

与强制用户创建整个类只是为了提供单一方法相比,Matlab有更好的解决方案。看看他们的anonymous functions

请注意,Matlab中的匿名函数有奇怪的作用域规则。确保您阅读链接帮助页面的“表达式中使用的变量”部分。如果你想要更传统的词汇范围,请看nested functions

编辑: 我假设你将会从Matlab进行轮询,而不是将谓词函数传递给Java。例如:

function waitForPredicate(pred) 
    while pred 
    end 
end 

waitForPredicate(@()javaApi.isMyConditionMet()); 
+0

不幸的是,我试图让我的API更容易用于最常见的用例以及Matlab。基本上,API用于访问(Java)对象。但是,从用户的角度来看,该对象可能不是“准备好”的。我不希望自己实现轮询逻辑,而是希望提供一个简单的waitUntilXIsReady机制。您的建议存在的问题是API上没有“isMyConditionMet”。这是Matlab最终用户需要决定他是否对此感到满意 – 2009-04-23 15:37:43