2014-09-12 64 views
6

我有一個類龍目島各種建設者的註釋?

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

,我想與Lombok簡化。

如果我添加註釋@AllArgsConstructor比我看不到默認的構造函數。

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

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

是否有可能在Lombok有兩個構造函數?

回答

17

您的類等同於:

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

    private T data; 
} 

雖然嚴格來說這增加了對所有變量toStringequalshashCode方法。這可能(並且通常會)導致無限循環。非常謹慎@Data

@Accessors(chain = true)使得setter實現返回this,更多信息here

您可以添加多個構造註釋:

與大多數其他龍目島的註釋,明確的構造函數的存在不會產生自己的構造函數阻止這些註解。

注意@Accessors是這樣的實驗可以改變/在未來的某個時刻重新命名。

我喜歡@Builder@AllArgsConstructor,因爲它僅允許需要參數進行設置,而所有參數的構造函數是全有或全無。它還生成更可讀的代碼,考慮

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

對戰

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

謝謝。有用。 – barbara 2014-09-12 13:20:20

+2

我會半贊成'@訪問者'支持[配置](http://projectlombok.org/features/configuration.html)。關於構造函數,我寧願使用'@ RequiredArgsConstructor'。與Guice結合,它意味着,我只是聲明一個字段,並可以使用它(在代碼中沒有構造函數調用)。 – maaartinus 2014-09-12 14:06:27

+0

不知道配置 - 這是一個閃亮的新事物。謝謝你的提示。 – 2014-09-12 15:02:58

5

你試過嗎?

@NoArgsConstructor 
@AllArgsConstructor 
+0

由於某種原因,在我的情況下,這僅創建了第一個構造函數(無參數),而忽略第二個。如果我翻轉訂單,問題也會翻轉...... – kiedysktos 2018-02-02 13:51:09