为什么EMF中的eGet返回Object而不是EObject?

时间:2010-03-29 11:39:43

标签: eclipse code-generation modeling api-design eclipse-emf

我正在使用Java中的EMF框架处理一些代码,但实际上很难使用,例如我不能在EMF之上实现类似OCL的查询API,这将是类型安全的。

其中一个原因是eGet()的{​​{1}}只返回EStructuralFeature,而不是Object。所以我写的任何东西都必须使用大量的空检查,类型检查和类型转换,这是不安全的,不是高效的,不能以可重用的方式推广。

为什么EMF不会为任意EObject值的EObject包装器生成虚拟实现?

即使使用简单的抛出Object,实现EObject因此EClass接口实际上也很痛苦(API太大了)。同样适用于UnsupportedOperationException方法,这使得模型向上导航变得痛苦。

2 个答案:

答案 0 :(得分:3)

使用相同的方法访问简单属性值(可以是任何Java类型)并遍历与其他建模对象的关系,这些可以是单个或多值。

EMF提供了通用机制来检查对象是否是EClass的实例,或者EClass是否可以分配给另一个,所以我真的没有看到它的问题。

答案 1 :(得分:1)

eGet()方法是EMF反射API的一部分。由于EMF可以包装任何可序列化的对象,因此您无法限制此类反射API的返回对象。

为什么需要使用这个反射API而不是生成的ecore模型的Java实现?这样,您将拥有所有直接良好类型的API来操作您的域对象。