java如何在类之间共享字段和方法

时间:2019-05-08 13:24:11

标签: java spring jackson swagger springfox

我有一些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类ex的一些字段和方法:

//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来自其他服务的。我还需要用它来生成一个大张旗鼓的文档(我使用springfox)。这就是为什么我需要字段和方法的原因。

=========我做了一些研究

我找到了一个名为 lombok 的库,它具有功能名称@Delegate https://projectlombok.org/features/experimental/Delegate

//from base1
public class Domain1Vo {
    private String domain1Field1;
    @Delegate
    private Base1 base1;
    // getter & setter
}

它可以从BaseX类生成方法,但不能从字段生成。

1 个答案:

答案 0 :(得分:1)

您想要的就是构图。继承被过度使用(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
}