2017-08-24 68 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; 
    } 
} 
相关问题