扩展从XML模式生成的类是否安全?

时间:2009-07-28 14:01:26

标签: java oop schema

假设我有这个(非常)简化的XML模式:

<xsd:complexType name="Person">
  <xsd:sequence>
    <xsd:element ref="FirstName"/>
    <xsd:element ref="FamilyName"/>
  </xsd:sequence>
</xsd:complexType>

如果我从中生成一个Java类,我会得到这样的结果:

public class Person {
  protected FirstName firstName;
  protected FamilyName familyName;

  // and the usual getters and setters
}

这个类闻起来像Data Class,我想为它添加行为。在我看来,扩展它是最明显的解决方案,但是我是否可以始终依赖这些Java类来安全地扩展?这样做会安全吗?

一个相关的问题:你如何命名增强类?你会给它与原始类同名但在另一个包中吗?你会称它为MyPerson吗?

4 个答案:

答案 0 :(得分:4)

将自动生成的混合与手工制作的代码混合起来总是有点麻烦。如果更改了模式并重新生成了类,那么您自己的自定义类将会中断。

我会避免扩展自动生成的类。如果确实需要为其添加功能,则首选组合而不是继承。这意味着创建一个包含Person作为字段对象的MyPerson类。如果修改了xml架构并重新生成了Person类,那么MyPerson类将再次中断,但是:

  • 通过精心设计,破坏性更改不会影响MyPerson类之外的代码。如果您选择继承并且方法更改其名称,则需要在班级的所有调用者中进行更改。
  • 修复破坏性更改会更容易。编译器将为您提供缺少方法的清晰描述。

答案 1 :(得分:0)

如果你想做这种事情,我建议你好好看看Eclipse Modelling Framework (EMF)

EMF工具集可以使用XSD并使用它来提取EMF模型,然后生成Java类。 您可以修改生成的类,并且只要遵循一个简单的规则,当您更改XSD /模型并重新生成类时,您的修改不会丢失。

生成的代码中的每个可修改成员声明前面都有一个Java注释,它将成员标记为已生成。如果要修改成员,请删除此注释并进行更改。下次重新生成时,生成器通过成员比较每个类的旧版本和新版本执行成员,查找其签名匹配的成员,并根据“旧”版本中“生成的”标记注释的存在更新它们。这非常有效。您偶尔需要进行一些手动整理(例如删除不再需要的导入),但是如果您记得删除标记注释,则不会丢失更改。 (但最好还是检查生成的代码......如果只是版本控制你的更改!)

如果您不喜欢EMF生成的代码,您可以在模型的相关GenModel中调整许多代码生成选项,或者您可以修改或替换组成EMF源代码生成器的JET模板。

除了在内存中生成表示XML的类之外,EMF还为您的数据结构提供了XML序列化器/反序列化器和基于GUI的可扩展/可定制编辑器。相关的EMF项目包括用于将数据保存到数据库中的工具,使用验证规则,事务,查询和比较来扩充模型。在相关的Eclipse Modeling项目中还有更多。

EMF documents页面上有一大堆白皮书,教程和其他文档

答案 2 :(得分:0)

独立于该类是否自动生成:气味不是很糟糕但很甜。我永远不会向数据类添加行为,但为行为创建/许多单独的类/ es。此类的目的是将xml编码信息作为java对象提供。班级不应该做任何其他事情。这使代码清晰易懂。

您可以将'Person'类重命名为'FullPersonName'(或描述数据类的真实内容的其他内容),并为另一个类保留'Person'类名,该类描述'a''' FullPersonName'(=组成)。

修改

这可能会引起争议。 Gene Garcia将数据类添加到他的“气味”列表中并建议将行为移入其中。 Clean Code作者鼓励读者将关注点分开,不要创建混合类。我,我喜欢干净的代码。

答案 3 :(得分:0)

为了记录,我发现Unofficial JAXB Guide确实建议在new behaviour is required时继承JAXB生成的类。但是,他们提醒说“向生成的代码添加行为是一个仍需要改进的领域。