2017-08-08 64 views
3

如果我有一個具有三個實例變量和一個實例最終變量的類。龍目島的構造函數

我將被禁止使用無參數構造函數創建該類的實例嗎?

public @Data class Employee { 

    private Integer empId; 

    private String empName; 

    private Country country; 

    private final Integer var; 

} 

當試圖編譯以下行

Employee emp = new Employee(); 

然後,我得到這個錯誤

需要的參數相匹配的員工(整數)。

回答

2

使用是的,它會限制無參數的構造函數,除非你初始化最終變量。如果初始化最終變量,它將允許使用默認無參數構造函數創建該類的實例。但是不會爲該最終變量生成setter,但是會生成getter。 即使我們使用@NoArgsConstructor,它也會拋出編譯器錯誤,說明: final variable may not be initialized

2

您的變量var是最終的。刪除最後一個,以允許var引用可重新分配。

+1

最終字段可以是可變的, – xenteros

3

您的Integer var是最終顯示。您只能在構造函數或初始化程序中設置最終變量。

因此,在這種情況下,你不能用龍目島的構造做,你需要初始化你的最後一個變量第一

private final Integer var = someValue; 
1

簡短的回答

,你是從使用無參數的構造函數創建類的實例限制。

長的答案

documentation for @Data

@Data是一種方便快捷註釋捆綁的 @ToString,@EqualsAndHashCode,@Getter/@Setter和 特徵@RequiredArgsConstructor together

@RequiredArgsConstructor is

@RequiredArgsConstructor生成具有1個參數 每個字段需要特殊處理的構造函數。 所有未初始化的最終 字段獲取參數以及任何標記爲 @NonNull的字段,它們在聲明時未初始化。

正如你應該知道,Java不生成默認的無參數的構造函數,如果您已經定義了自己的構造 - 並通過龍目島的@Data註解,你有。

你可以明確加龍目島的@NoArgsConstructor,但是:

@NoArgsConstructor將產生不帶參數的構造函數。 如果 這是(因爲最終場)不可能,一個編譯器錯誤將 結果,而不是