作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 BaseX pojo 类:
public class Base1 {
private String base1Field1;
private String base1Field2;
// getter & setter
}
public class Base2 {
private String base2Field1;
private String base2Field2;
// getter & setter
}
还有一些 DomainVo pojo 类,它有一些来自 BaseX 类的字段和方法:
//from base1
public class Domain1Vo {
private String domain1Field1;
private String base1Field1;
private String base1Field2;
// getter & setter
}
//from base1 & base 2
public class Domain2Vo {
private String domain2Field1;
private String base1Field1;
private String base1Field2;
private String base2Field1;
private String base2Field2;
// getter & setter
}
我不想将这些字段从 BaseX
类复制粘贴到我的域对象,但我不能使用 extends Base1, Base2
因为 java 不允许它。
我实际上并没有在代码中使用BaseX
,我定义它们只是想要一个地方来维护这些字段。
更新:我无法更改我的域对象结构,因为它以 json 形式来自/到其他服务。我还需要用它来生成一个 swagger 文档(我使用 springfox)。这就是为什么我需要字段和方法。
========我做了一些研究
我找到了一个名为lombok的库,它有一个功能名称@Delegate
https://projectlombok.org/features/experimental/Delegate
//from base1
public class Domain1Vo {
private String domain1Field1;
@Delegate
private Base1 base1;
// getter & setter
}
它可以从BaseX
类生成方法,但不能从字段生成。
最佳答案
构图就是你想要的。继承被严重过度使用(还有 getter,尤其是 setter)。
基类成为组件。 (使用更好的名称!即使是“base”也不是一个在类名中使用的有用词。)
public final class Component1 {
private String component1Field1;
private String component1Field2;
// domain methods
}
public final class Component2 {
private String component2Field1;
private String component2Field2;
}
public final class Domain1Vo {
private String domain1Field1;
private final Component1 component1;
public Domain1Vo(
Component1 component1
) {
// Or construct.
this.component1 =
Objects.requireNonNull(component1);
}
// domain methods
}
//from base1 & base 2
public final class Domain2Vo {
private String domain2Field1;
private final Component1 component1;
private final Component2 component2;
public Domain2Vo(
Component1 component1,
Component2 component2,
) {
// Or construct.
this.component1 =
Objects.requireNonNull(component1);
this.component2 =
Objects.requireNonNull(component2);
}
// domain methods
}
关于java如何在类之间共享字段和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56041893/
我是一名优秀的程序员,十分优秀!