Обратный вызов Matlab / Java API
-
13-09-2019 - |
Вопрос
Я разрабатываю API (на Java) и ожидаю, что пользователи будут получать доступ к API из Matlab.Проблема в том, что я хочу, чтобы API предоставлял часть функциональности, такую как:
javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test);
Мой API (в фоновом режиме) получает доступ к экземплярам Java Obj
(с помощью некоторого механизма, например опрос).Я хочу, чтобы этот метод API блокировался до тех пор, пока один из этих экземпляров, когда передается в Predicate
оценивает, чтобы true
.Если бы я вызывал этот API из Java, я бы сделал:
javaApi.waitUntilPredicateIsTrue(new Predicate<JavaObj>() {
public boolean evaluate(JavaObj jo) {
return "READY".equals(jo.getState());
}
});
Вы уловили идею.
Как это можно вызвать из Matlab? Могу ли я использовать анонимные внутренние классы из Matlab?Могу ли я объявить Matlab classdef
который расширяет интерфейс Predicate
(может ли это справиться с универсальной версией Java)?
Решение
Это звучит как непростой вопрос.Я все еще использую R2006b, так что это могло измениться, но, похоже, MATLAB не будет переводить дескрипторы функций (вкл.анонимные функции) и структуры в объекты Java.Я не знаю о пользовательских классах MATLAB, так как синтаксис изменился.Строки, массивы и массивы ячеек переведет должным образом.Они вообще не комментируют реализацию интерфейсов.(:пи :пи : ПИ-БУ-ШИПЕНИЕ)
Редактировать:только что нашел эту страницу на Matlab Центральный, в нем говорится о некоторых недокументированных интерфейсах.
Другие советы
У Matlab есть гораздо более приятное решение, чем заставлять пользователей создавать целый класс только для того, чтобы предоставить один метод.Взгляните на их анонимные функции.
Обратите внимание, что анонимные функции в Matlab имеют нечетные правила определения области видимости.Убедитесь, что вы прочитали раздел "Переменные, используемые в выражении" на связанной странице справки.Если вам нужен более традиционный лексический охват, взгляните на вложенные функции.
Редактировать: Я предполагаю, что вы будете выполнять опрос из Matlab, а не передавать функцию предиката в Java.Пример:
function waitForPredicate(pred)
while pred
end
end
waitForPredicate(@()javaApi.isMyConditionMet());