2009-04-23 8 views
2

Je suis en train de concevoir une API (en Java) et je m'attends à ce que les utilisateurs accèdent à l'API depuis Matlab. Le problème est que je veux l'API pour fournir un morceau de fonctionnalités telles que:Rappel API Matlab/Java

javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test); 

Mon API (en arrière-plan) se saisit des instances de Java Obj (via un mécanisme, par exemple interrogation). Je souhaite que cette méthode API se bloque jusqu'à ce que l'une de ces instances, lorsqu'elle est transmise au Predicate, évalue à true. Si j'appelais cette API de Java, je ferais:

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

Vous avez l'idée. Comment cela peut-il être appelé à partir de Matlab?

Comment cela peut-il être appelé depuis Matlab? Puis-je utiliser des classes internes anonymes de Matlab? Puis-je déclarer un Matlab classdef qui étend l'interface Predicate (cela peut-il faire face à la version générique de Java)?

Répondre

2

Cela semble être une question difficile. Je suis toujours en cours d'exécution R2006b donc cela peut avoir changé, mais il semble que MATLAB ne traduira pas les poignées de fonction (y compris les fonctions anonymes) et les structures en objets Java. Je ne connais pas les classes personnalisées MATLAB, puisque la syntaxe a changé. Chaînes, matrices et matrices de cellules will translate properly. Ils ne commentent pas du tout l'implémentation des interfaces. (: p: p: p BOO HISS)

edit: vient de trouver cette page sur Matlab Central, il parle de certaines interfaces non documentées.

1

Matlab a une solution beaucoup plus agréable que de forcer les utilisateurs à créer une classe entière simplement pour fournir une méthode unique. Jetez un oeil à leur anonymous functions.

Notez que les fonctions anonymes dans Matlab ont des règles de portée impaire. Assurez-vous de lire la section "Variables utilisées dans l'expression" de la page d'aide liée. Si vous voulez une portée lexicale plus traditionnelle, jetez un oeil à nested functions.

EDIT: Je suppose que vous allez faire le vote de Matlab, ne passe pas la fonction principale à Java. Exemple:

function waitForPredicate(pred) 
    while pred 
    end 
end 

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

Malheureusement pas; J'essaie de rendre mon API plus facile à utiliser pour les cas d'utilisation les plus courants et de Matlab. Fondamentalement, l'API est utilisée pour accéder aux objets (Java). Cependant, l'objet peut ne pas être "prêt" du point de vue de l'utilisateur. Plutôt que d'implémenter eux-mêmes la logique d'interrogation, j'espérais fournir un mécanisme waitUntilXIsReady simple. Le problème avec votre suggestion est qu'il n'y a pas de "isMyConditionMet" sur l'API. C'est l'utilisateur final de Matlab qui doit décider s'il est content –

+0

Je devrais aussi dire que la "logique d'interrogation" est plus compliquée que de simplement tourner sur "! ConditionIsMet", en dormant un peu entre les deux (bien que vous puissiez le faire cette). En effet, une version plus récente de l'objet pourrait être prête pour vous (elle est rejetée via un événement publié dans un groupe de multidiffusion). Je ne veux vraiment pas que mes utilisateurs de Matlab se tromper avec la multidiffusion brute! –