Java, как разделить поле и метод между классами - PullRequest
0 голосов
/ 08 мая 2019

У меня есть некоторый класс 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 в своем кодеЯ определяю их, просто хочу, чтобы одно место поддерживало это поле.

update: я не могу изменить структуру моего доменного объекта, потому что он пришел из / в другой сервис как json.Кроме того, мне нужно использовать его для создания документа Swagger (я использую Springfox).Вот почему мне нужны и поле, и метод.

======== некоторые исследования, которые я провел

Я нашел библиотеку с именем lombok , в ней есть особенностьname @Delegate https://projectlombok.org/features/experimental/Delegate

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

Может генерировать метод из BaseX класса, но не из поля.

1 Ответ

1 голос
/ 08 мая 2019

Композиция - это то, что вы хотите. Наследование используется чрезмерно (также получатели и, особенно, установщики).

Базовые классы становятся компонентами. (Используйте лучшие имена! Даже «базовый» не является полезным словом для использования в имени класса.)

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