2015-11-26 2 views
3

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

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). Как я могу сгенерировать его с помощью Ломбока?

+0

Вы используете java8? – Jeff

ответ

4

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

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

0

Мне не удалось получить метод @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-вы можете обойти тот факт, что Ломбки соответствуют только имени метода, а не всей подпись при создании методов строителя с помощью интерфейса с помощью метода по умолчанию.

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()); 

    } 
}