![](/img/trans.png)
[英]How to make generated classes contain Javadoc from XML Schema documentation
[英]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類將再次中斷,但是:
如果你想做這種事情,我建議你仔細看看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將數據類添加到他的“氣味”列表中並建議將行為移入其中。 清潔代碼作者鼓勵讀者將關注點分開,不要創建混合類。 我,我喜歡干凈的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.