我正在使用Java中的EMF框架处理一些代码,但实际上很难使用,例如我不能在EMF之上实现类似OCL的查询API,这将是类型安全的。
其中一个原因是eGet()
的{{1}}只返回EStructuralFeature
,而不是Object
。所以我写的任何东西都必须使用大量的空检查,类型检查和类型转换,这是不安全的,不是高效的,不能以可重用的方式推广。
为什么EMF不会为任意EObject
值的EObject
包装器生成虚拟实现?
即使使用简单的抛出Object
,实现EObject
因此EClass
接口实际上也很痛苦(API太大了)。同样适用于UnsupportedOperationException
方法,这使得模型向上导航变得痛苦。
答案 0 :(得分:3)
使用相同的方法访问简单属性值(可以是任何Java类型)并遍历与其他建模对象的关系,这些可以是单个或多值。
EMF提供了通用机制来检查对象是否是EClass的实例,或者EClass是否可以分配给另一个,所以我真的没有看到它的问题。
答案 1 :(得分:1)
eGet()方法是EMF反射API的一部分。由于EMF可以包装任何可序列化的对象,因此您无法限制此类反射API的返回对象。
为什么需要使用这个反射API而不是生成的ecore模型的Java实现?这样,您将拥有所有直接良好类型的API来操作您的域对象。