Настройка Builder, сгенерированного Lombok

Я определил класс с помощью компоновщика, и теперь я хотел бы ограничить шаблонный код, используя аннотацию Lombok @Builder.

public class ClientApp {

    private UUID clientId;

    ClientApp(UUID clientId) {
      this.clientId = clientId;
    }

    public static Builder builder() {
      return new Builder();
    }

    public static class Builder {

      private UUID clientId;

      public Builder clientId(String clientId) {
        return clientId(UUID.fromString(clientId));
      }

      public Builder clientId(UUID clientId) {
        this.clientId = clientId;
        return this;
      }

      public ClientApp build() {
        return new ClientApp(this.clientId);
      }
    }

    public Builder clientId(String clientId) {
        return clientId(UUID.fromString(clientId));
    }
}

Однако аннотация не будет генерировать метод clientId(String), а только clientId(UUID). Как я могу сгенерировать его с помощью Lombok?


person dzieciou    schedule 26.11.2015    source источник
comment
Вы используете java8?   -  person Jeff    schedule 15.12.2015


Ответы (2)


Что ж, lombok не сгенерирует это для вас, но вы можете использовать @Builder с классом ClientAppBuilder и иметь класс, содержащий один метод, который принимает строку и направляет ее другому методу, который должен быть сгенерирован. Возможно, вам нужно пометить свой метод @Tolerate, иначе Lombok не сгенерирует метод приема UUID.

Раскрытие информации: я разработчик Lombok.

person Roel Spilker    schedule 30.11.2015

Мне не удалось заставить метод @Tolerate работать (возможно, я делаю это неправильно).

     /**
     * Fails with The method clientId(String) in the type So33943193.ClientApp.ClientAppBuilder is not applicable
     * for the arguments (UUID)
     */
    public static class ClientAppBuilder {

        @Tolerate
        public ClientAppBuilder clientId(String clientId) {
            return this.clientId(UUID.fromString(clientId));
        }
    }

Но если вы используете java 8, вы можете обойти тот факт, что lombok соответствует только имени метода, а не всей подписи при создании методов компоновщика, используя интерфейс с методом по умолчанию.

package lombok.javac.handlers.stackoverflow;

import static org.junit.Assert.*;

import java.util.UUID;

import lombok.Builder;
import lombok.Value;

import org.junit.Test;

public class So33943193 {

    /**
     * The Interface WithClientUUID.
     *
     * @param <BLDR> the builder type
     */
    public static interface WithClientUUID<BLDR extends WithClientUUID<BLDR>> {

        /**
         * Client id.
         *
         * @param clientId the client id
         * @return the bldr
         */
        default BLDR clientId(String clientId) {
            return this.clientId(UUID.fromString(clientId));
        }

        /**
         * Client id.
         *
         * @param clientId the client id
         * @return the bldr
         */
        BLDR clientId(UUID clientId);

    }

    /**
     * The Class ClientApp.
     */
    @Builder(toBuilder = true)
    @Value
    public static class ClientApp {

        /** The client id. */
        private final UUID clientId;

        /**
         * Instantiates a new client app.
         *
         * @param clientId the client id
         */
        ClientApp(UUID clientId) {
            this.clientId = clientId;
        }

        /**
         * Implement the builder and extend the interface.
         */
        public static class ClientAppBuilder implements WithClientUUID<ClientAppBuilder> {}

    }

    /**
     * Test all scenarios
     */
    @Test
    public void testClientApp() {
        UUID expected = UUID.randomUUID();
        final ClientApp fromUuid = ClientApp.builder()
            .clientId(expected)
            .build();
        final ClientApp fromString = ClientApp.builder()
            .clientId(expected.toString())
            .build();
        assertEquals(expected, fromUuid.getClientId());
        assertEquals(expected, fromString.getClientId());

    }
}
person Jeff    schedule 15.12.2015