【问题标题】:java how to share field and method between classesjava如何在类之间共享字段和方法
【发布时间】:2019-09-26 06:07:42
【问题描述】:

我有一些 BaseX pojo 类 ex:

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。我还需要用它来生成一个招摇的文档(我使用 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 融合到一个类中吗?有一个设计准则称为“组合优于继承”。 en.wikipedia.org/wiki/Composition_over_inheritance也许你的解决方案是包装 Base1 和 Base2,而不是扩展它们?
  • 我无法更改域对象,请检查我的更新。

标签: java spring jackson swagger springfox


【解决方案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
}

【讨论】:

  • 我无法更改我的域对象结构,因为它来自/来自其他服务作为 json。我还需要用它来生成一个招摇的文档(springfox)。这就是我需要字段和方法的原因。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2020-09-23
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多