Как установить поля базового класса с помощью Immutables и Egg pattern - PullRequest
1 голос
/ 11 января 2020

Я использую Java https://immutables.github.io/ и у меня возникли проблемы с базовым классом и один раз настраивает его поля.

У меня есть неизменяемые объекты, использующие Шаблон яйца для совместного использования полей, например:

interface HousingBase {
  int streetNumber();
  String streetName();
  int zip();
}

@Value.Immutable
interface House extends HousingBase {
  long lotSize();
}

@Value.Immutable
interface Apartment extends HousingBase {
  int apartmentNumber();
}

Проблема заключается в том, что мой код создает эти объекты из набора полей HousingBase, и я получаю дубликат кода, например:

public ImmutableHouse toHouse(HouseLocation location) {
  return ImmutableHouse.builder()
    .setStreetNumber(location.number())
    .setStreetName(location.street())
    .setZip(location.zip())
    .setLotSize(location.size())
    .build();
}
public ImmutableApartment toHouse(ApartmentLocation location) {
  return ImmutableApartment.builder()
    .setStreetNumber(location.number())
    .setStreetName(location.street())
    .setZip(location.zip())
    .setApartmentNumber(location.complex())
    .build();
}

Что я действительно хочу, так это какой-то способ установить поля HousingBase, чтобы они были определены один раз. Например:

public ImmutableApartment toHouse(ApartmentLocation location) {
  return setBaseFields(ImmutableApartment.builder(), location)
    .setApartmentNumber(location.complex())
    .build();
}

private Builder setBaseFields(Builder builder, Location location) {
  return builder
    .setStreetNumber(location.number())
    .setStreetName(location.street())
    .setZip(location.zip())
} 

Но я не могу понять, как это работает или возможно ли это с этой библиотекой.

1 Ответ

0 голосов
/ 11 января 2020

Дженерики!

private static <B extends Builder> B setBaseFields(B builder, Location location) {
...