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

标签 java generics design-patterns

我们根据两个 XSD 文件生成 Java 类。这些类位于各自对应的 XSD 文件(a 和 b)的包中。我们希望对生成的类使用的方法是相同的。但它们不实现接口(interface)或父类(super class)。我们无法控制 XSD,它是提供的。

示例:

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

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

我们现在想在我们自己编写的代码中使用这些类,但不想重复它。

所以现在我们必须通过复制代码来使用接口(interface):

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 的隐式接口(interface),但我们正在处理 Java。有没有办法用泛型来实现这一点?

最佳答案

我建议您通过扩展该版本来决定在大多数代码中仅使用这些包实现之一(例如“a.X”),以及在必须生成或使用另一个包的少数地方(例如“b.X”版本),提供转换。这可以通过多种方式来完成。以下是两种可能的解决方案:

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;
    }
}

关于java - 如何避免使用来自不同包的生成类的重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45857964/

相关文章:

java - android studio 中未检测到我的设备(驱动程序问题)

java - 与 Java 11 兼容的最低 Spring 版本

java - 如何从 Do While 封闭开关中的 Integer ArrayList 返回平均值

java - 显式类型参数可以冗余吗?

swift - 如何制定描述字符串可表示枚举的协议(protocol)?

java - 集合比具有泛型类型的标准列表更安全?

javascript - 不会扰乱 eslint 的 javascript 实例化模式

c# - 单独实现编程设计

java - 使用未完全初始化的 'this' 作为参数实例化对象

java - 使用 InstanceOf 实现 Visitor