2010-03-29 18 views
1

Je travaille sur du code en utilisant le framework EMF en Java, mais il est vraiment difficile à utiliser, par exemple. Je ne peux pas implémenter une API de requête de type OCL au-dessus de EMF qui serait sécurisée.Pourquoi eGet dans EMF renvoie Object plutôt que EObject?

L'une des raisons est que eGet() pour un EStructuralFeature renvoie simplement un Object, et non EObject. Donc, tout ce que j'écrirais doit utiliser une grande partie des vérifications nuls, des vérifications de types et des transtypages qui sont dangereux, non performants et qui ne peuvent pas être généralisés de manière réutilisable. Pourquoi les champs électromagnétiques ne génèrent-ils pas des implémentations fictives avec des enveloppes EObject pour une valeur arbitraire Object?

L'implémentation des EObject et donc les interfaces EClass même avec le simple lancer UnsupportedOperationException est vraiment pénible (les API sont trop grandes). La même chose vaut pour la méthode eContainer() qui rend la navigation du modèle douloureuse.

+0

Je viens de réaliser EMF a wrappers pour les types primitifs de Java et leurs équivalents d'objet, mais la question demeure, pourquoi l'API qui retourne des objets? –

Répondre

3

La même méthode est utilisée pour accéder aux valeurs d'attributs simples (qui peuvent être de n'importe quel type Java) et pour traverser les relations avec d'autres objets modélisés, et celles-ci peuvent être uniques ou à valeurs multiples. EMF fournit des mécanismes génériques pour vérifier si un objet est une instance d'un EClass, ou si un EClass est assignable à un autre, donc je ne vois pas vraiment le problème avec cela.

+1

BTW, il n'y a pas de meilleur endroit pour poser cette question que le groupe de discussion EMF: http://www.eclipse.org/forums/index.php?t=thread&frm_id=108 – user48945

+0

Toujours ma première impression est qu'il n'est pas différent de Java avec des types primitifs et sans autoboxing. Je vais réfléchir et programmer pour avoir une opinion raisonnable. –

1

La méthode eGet() fait partie de l'API réflective EMF. Comme EMF peut envelopper n'importe quel objet sérialisable, vous ne pouvez pas restreindre l'objet retourné d'une telle API réfléchissante. Pourquoi avez-vous besoin d'utiliser cette API réflective à la place de l'implémentation Java générée de votre modèle ecore? De cette façon, vous aurez toute l'API directement typée pour manipuler les objets de votre domaine.

+0

J'utilise Eclipse Xtext et je ne peux pas définir des éléments de modèle arbitraires dans la grammaire (par exemple, association parentée typée). Quand j'écris des services en Xtext (code Java), j'ai besoin de traverser le modèle, mais sans vraies associations, je dois utiliser l'API réfléchissante et lancer beaucoup. eGet ne me laissera pas écrire un joli code générique pour gérer ça pour moi. –