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

问题描述 投票:3回答:1

我们基于两个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。泛型是否有办法解决这个问题?

java generics design-patterns
1个回答
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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.