2009-04-23 66 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