gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:44:27 26 4
gpt4 key购买 nike

我们根据两个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com