2017-08-24 104 views
3

我們基於兩個XSD文件生成Java類。這些類落在與XSD文件(a和b)相關的包中。我們想要使用生成的類的方法是相同的。但是他們沒有實現一個接口或一個超類。我們無法控制XSD,它提供了。如何避免使用不同包中生成的類生成重複代碼

例子:

package code.generated.a; 
class X { 
    void do() {...} 
} 

package code.generated.b; 
class X { 
    void do() {...} 
} 

我們現在想在我們自己編寫的代碼使用這些類,但不希望複製它。

所以截至目前,我們通過複製代碼來使用接口:

package code.ours.a 
class Consumer { 
    void use(code.generated.a.X x) {...} 
} 

package code.ours.b 
class Consumer { 
    void use(code.generated.b.X x) {...} 
} 

什麼是解決重複代碼的推薦方法?想到Go的隱式接口,但我們正在處理Java。用泛型有沒有辦法解決這個問題?

+0

試圖指定的包名的代碼生成器,是兩個XSD同... –

回答

0

我建議你決定在大多數代碼中通過擴展該版本來使用這些包實現中的一個(例如'a.X'),並且在那些必須生成或使用其他代碼的地方(例如'bX'版本)提供轉換。這可以通過幾種方式完成。以下是兩個可能的解決方案:

package code.ours; 
class Consumer extends code.generated.a.X { 
    public Consumer() {} 
    public Consumer(code.generated.a.X original) { 
     setName(original.getName()); 
    } 
    public Consumer(code.generated.b.X original) { 
     setName(original.getName()); 
    } 
    public code.generated.b.X getB() { 
     code.generated.b.X result = new code.generated.b.X(); 
     result.setName(this.getName()); 
     return result; 
    } 
} 

package code.ours; 
class Consumer extends code.generated.a.X { 
    private code.generated.a.X delegate; 
    public Consumer() { 
     delegate = new code.generated.a.X delegate(); 
    } 
    public Consumer(code.generated.a.X original) { 
     delegate = original; 
    } 
    public Consumer(code.generated.b.X original) { 
     delegate = new code.generated.a.X(); 
     delegate.setName(original.getName()); 
    } 
    @Override 
    public String getName() { 
     return delegate.getName(); 
    } 
    @Override 
    public void setName(String name) { 
     delegate.setName(name); 
    } 
    public code.generated.b.X getB() { 
     code.generated.b.X result = new code.generated.b.X(); 
     result.setName(this.getName()); 
     return result; 
    } 
} 
相關問題