簡體   English   中英

擴展從XML模式生成的類是否安全?

[英]Is it safe to extend classes generated from an XML 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
}

這個類聞起來像一個數據類 ,我想添加行為。 在我看來,擴展它是最明顯的解決方案,但是我是否可以始終依賴這些Java類來安全地擴展? 它總是安全的嗎?

一個相關的問題:你如何命名增強類? 你會給它與原始類同名但在另一個包中嗎? 你會稱之為MyPerson嗎?

將自動生成的混合與手工制作的代碼混合起來總是有點麻煩。 如果更改了架構並重新生成了類,那么您自己的自定義類將會中斷。

我會避免擴展自動生成的類。 如果確實需要為其添加功能,則首選組合而不是繼承。 這意味着創建一個包含Person作為字段對象的MyPerson類。 如果修改了xml架構並重新生成了Person類,那么MyPerson類將再次中斷,但是:

  • 通過精心設計,突破性更改不會影響MyPerson類之外的代碼。 如果您選擇繼承並且方法更改其名稱,則需要在類的所有調用方中進行更改。
  • 修復突破性更改會更容易。 編譯器將為您提供缺少方法的清晰描述。

如果你想做這種事情,我建議你仔細看看Eclipse Modeling Framework(EMF)

EMF工具集可以使用XSD並使用它來提取EMF模型,然后生成Java類。 您可以修改生成的類,並提供遵循一個簡單的規則,當您更改XSD /模型並重新生成類時,您的修改不會丟失。

生成的代碼中的每個可修改成員聲明前面都有一個Java注釋,它將成員標記為已生成。 如果要修改成員,請刪除此注釋並進行更改。 下次重新生成時,生成器通過成員比較每個類的舊版本和新版本執行成員,查找其簽名匹配的成員,並根據“舊”版本中“生成的”標記注釋的存在更新它們。 這非常有效。 您偶爾需要進行一些手動整理(例如,刪除不再需要的導入),但是如果您記得刪除標記注釋,則不會丟失更改。 (但最好還是檢查生成的代碼......如果只是版本控制你的更改!)

如果您不喜歡EMF生成的代碼,您可以在模型的關聯GenModel中調整許多代碼生成選項,或者您可以修改或替換組成EMF源代碼生成器的JET模板。

除了在內存中生成表示XML的類之外,EMF還為您的數據結構提供了XML序列化器/反序列化器和基於GUI的可擴展/可定制編輯器。 相關的EMF項目包括用於將數據保存到數據庫中的工具,使用驗證規則,事務,查詢和比較來擴充模型。 在相關的Eclipse Modeling項目中還有更多內容。

EMF文檔頁面上有一整堆白皮書,教程和其他文檔

獨立於該類是否自動生成:氣味不是很糟糕但很甜。 我永遠不會向數據類添加行為,但為行為創建/許多單獨的類/ es。 此類的目的是將xml編碼信息作為java對象提供。 班級不應該做任何其他事情。 這使代碼清晰易懂。

您可以將'Person'類重命名為'FullPersonName'(或描述數據類的實際內容的其他內容),並為另一個類保留'Person'類名稱,該類描述具有'a FullPersonName'的'Person'( =組合物)。

編輯:

這可能是有爭議的。 Gene Garcia將數據類添加到他的“氣味”列表中並建議將行為移入其中。 清潔代碼作者鼓勵讀者將關注點分開,不要創建混合類。 我,我喜歡干凈的代碼。

為了記錄,我剛剛發現非官方JAXB指南確實建議在需要新行為時繼承JAXB生成的類。 但是,他們提醒說“ 向生成的代碼添加行為是一個仍需要改進的領域”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM