2014-09-12 8 views
6

Mam klasyAdnotacja dla różnych konstruktorów w Lombok?

public class Answer<T> { 
    private T data; 

    public Answer(T data) { 
     this.data = data; 
    } 

    public Answer() { 
    } 

    public T getData() { 
     return data; 
    } 

    public Answer<T> setData(T data) { 
     this.data = data; 
     return this; 
    } 
} 

który chcę upraszczać z Lombok.

Jeśli dodaję adnotację @AllArgsConstructor niż nie widzę domyślnego konstruktora.

@Data 
@AllArgsConstructor 
public class Answer<T> { 
    private T data; 

    public Answer<T> setData(T data) { 
     this.data = data; 
     return this; 
    } 
} 

Czy można mieć oba konstruktory w wersji Lombok?

Odpowiedz

17

Twoja klasa jest równoznaczne z:

@Accessors(chain = true) 
@Data  
@NoArgsConstructor 
@AllArgsConstructor 
public class Answer<T> { 

    private T data; 
} 

Choć ściśle mówiąc to dodaje toString, equals i hashCode metod na wszystkich zmiennych. Może to (i często powoduje) powodować nieskończone pętle. Bądź bardzo ostrożny wobec @Data.

powoduje, że implementacje setter wracają this, więcej informacji here.

Można dodać wiele adnotacji Konstruktor:

W przeciwieństwie do większości innych Lombok adnotacji, istnienie wyraźnego konstruktora nie zatrzymać tych adnotacji od generowania własnego konstruktora.

Należy zauważyć, że @Accessors jest eksperymentalna, więc może zostać zmieniona/zmieniona w jakimś przyszłym punkcie.

Wolę @Builder do @AllArgsConstructor gdyż pozwala tylko wymagane parametry mają być ustawione, podczas gdy konstruktor wszystkie argumenty to wszystko albo nic. To również generuje znacznie bardziej czytelnego kodu, należy rozważyć

new Thing(true, 1, 4, false, 4, 4.0) 

Versus

new Thing.Builder(). 
    setANamnedProperty(true). 
    setAnotherNamnedProperty(1). 
    .... 
    build(); 
+0

Dzięki. To działa. – barbara

+2

Będę częściowo deprecjonować '@ Accessors' na rzecz [konfiguracji] (http://projectlombok.org/features/configuration.html). W przypadku konstruktorów korzystam raczej wyłącznie z '@ RequiredArgsConstructor'. W połączeniu z Guice, oznacza to, że po prostu deklaruję pole i mogę go użyć (brak wywołań konstruktora w kodzie). – maaartinus

+0

Nie wiedziałem o konfiguracji - to nowe, błyszczące urządzenie. Dzięki za wskazówkę. –

5

Czy próbowałeś tego?

@NoArgsConstructor 
@AllArgsConstructor 
+0

z jakiegoś powodu w moim przypadku to tworzy tylko pierwszy konstruktor (bez args) i ignoruje drugi. Jeśli przestawię zamówienie, problem zostanie również zmieniony ... – kiedysktos