我已经阅读了一些 关于EMF的教程,但我仍然想知道为什么要使用它。
到目前为止,我是从 XSD 模式 + JXC或手动生成我的 POJO。
据我了解EMF,定义类之间的一些复杂关系(一对多等)可能很有用。但仅此而已吗?用 EMF 生成代码不是更复杂吗?它不会添加一些额外的依赖项吗?
一般而言,可以说使用 emf 在运行时提供了多种好处。
在第一阶段,您会注意到 ecore 类(和 emf 运行时)提供了您可能需要的应用程序中 POJO 的内容。在很多领域都不需要进一步编码,而在使用普通 POJO 时您需要手动编码:
EMF 的扩展甚至提供了更多:
您实际上可以争辩说 EMF/Ecore 为 POJO 提供了一个标准,并且围绕它发展了一个完整的生态系统,它实际上提供了您将以经典方法手动编码的内容。
老实说,EMF 的缺点是您与 Ecore 运行时相关联,如果您编写基于 Eclipse 的富客户端,这非常好,但如果您在服务器上,则可能会成为问题。
如果您唯一的兴趣是 POJO 的生成,那么我同意有许多替代方案可以实现与 EMF 相同的效果。
然而,Java 生成只是 EMF 的第一个应用。现在有大量基于 EMF 的 Eclipse 插件可以免费为您提供很多功能来操作(查询、验证、转换......)您的 EMF 模型。
有关 EMF 上的官方 Eclipse 项目列表,请参阅Eclipse 建模项目。
此外,请查看Acceleo以了解他们从 EMF 模型(用于 Java、PHP 等)的基于模板的生成方法的灵活性。
除了 Jordi 所说的之外,EMF 提供了通知机制,例如,它与 XML Beans 不同,它允许您添加侦听器来模型更改。因此,当模型中发生更改时,您会收到有关此更改的通知。
我已经成功地使用 EMF Query 使用类似 SQL 的语法和使用 OCL 来搜索模型。EMF Validation 是一个很好的框架,用于根据模式中定义的内容来验证您的模型,并且如果它不能在模式中表达,则可以引入您自己的验证逻辑。
高级 EMF 是模型驱动工程或 MDA 的 MOF 标准的实现。因此,使用 EMF,您可以从生成的 Java 代码中访问,而不是访问 Java 对象,而是访问它们的模型。这不仅仅是 Java 反射功能。