如何避免使用不同包中生成的类重复代码

时间:2017-08-24 09:32:18

标签: java generics design-patterns

我们基于两个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。有没有办法用泛型?

1 个答案:

答案 0 :(得分: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;
    }
}