【问题标题】:Why eGet in EMF returns Object rather than EObject?为什么 EMF 中的 eGet 返回 Object 而不是 EObject?
【发布时间】:2011-02-02 00:17:01
【问题描述】:

我正在使用 Java 中的 EMF 框架编写一些代码,但它真的很难使用,例如我无法在 EMF 之上实现类型安全的类似 OCL 的查询 API。

其中一个原因是eGet()EStructuralFeature 只返回Object,而不是EObject。所以我写的任何东西都必须使用大量的空值检查、类型检查和类型转换,这些都是不安全的、不高效的并且不能以可重用的方式概括。

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

实现EObjectEClass 接口,即使是简单的抛出UnsupportedOperationException 也确实很痛苦(API 太大)。 eContainer() 方法也是如此,这使得向上导航模型很痛苦。

【问题讨论】:

  • 我刚刚意识到 EMF 对 Java 的原始类型及其 Object 等价物有包装器,但问题仍然存在,为什么有返回 Objects 的 API?

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


【解决方案1】:

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

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

【讨论】:

  • 顺便说一句,没有比 EMF 新闻组更好的地方问这个问题了:eclipse.org/forums/index.php?t=thread&frm_id=108
  • 我的第一印象仍然是它与具有原始类型且没有自动装箱的 Java 没有什么不同。我会做一些思考和编程来创造一些明智的意见。
【解决方案2】:

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

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

【讨论】:

  • 我正在使用 Eclipse Xtext,我无法在语法中定义任意模型元素(例如,键入的父关联)。当我在 Xtext(Java 代码)中编写一些服务时,我需要遍历模型,但没有真正的关联,我必须使用反射 API 并进行大量转换。 eGet 返回 Object 不会让我编写好的通用代码来为我处理这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 2021-01-29
  • 1970-01-01
  • 2011-09-04
  • 2021-05-12
  • 2014-05-04
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多