2017-08-08 11 views
3

私は3つのインスタンス変数と1つのインスタンス最終変数を持つクラスを持っています。Lombokのコンストラクタ機能

引数のないコンストラクタを使用して、そのクラスのインスタンスを作成することを制限しますか?その後

Employee emp = new Employee(); 

次の行をコンパイルしようとしたとき

public @Data class Employee { 

    private Integer empId; 

    private String empName; 

    private Country country; 

    private final Integer var; 

} 

、私はこのエラー

は、従業員(整数)を一致させるために、引数を必要としました。

答えて

2

最終的な変数最初を初期化する必要がありますが、初期化しない限り、はい、それは、引数なしのコンストラクタの使用を制限します最終変数。最終変数を初期化すると、デフォルトの引数なしコンストラクタを使用してそのクラスのインスタンスを作成できます。しかし、最終変数にはセッターは生成されませんが、ゲッターが生成されます。 @NoArgsConstructorを使用しても、 final variable may not be initializedというコンパイラエラーが発生します。

2

変数varが最終です。 varの参照を再割り当て可能にするには、finalを削除します。

+1

決勝のフィールドは可変することができます – xenteros

3

Integer varが最終です。最終変数は、コンストラクタまたはイニシャライザでのみ設定できます。この場合には、あなたはロンボクを使用してコンストラクタで行うことはできません

だから、あなたは

private final Integer var = someValue; 
1

短い答えは

はい、あなたは引数なしのコンストラクタを使用して、そのクラスのインスタンスを作成することが制限されています。 documentation for @Dataから

長い答え

@Dataは @ToString、@EqualsAndHashCode、@Getter/@Setterと の機能をバンドル便利なショートカット注釈です@ RequeredArgsConstructor一緒に

@RequiredArgsConstructor is

@RequiredArgsConstructorは特別な処理を必要と 各フィールドの1つのパラメータを持つコンストラクタを生成します。 初期化されていないすべての最終フィールド は、パラメータと、宣言されている場所では初期化されていない @NonNullとしてマークされているフィールドを取得します。

あなたが知っておくべきとして、あなたはすでに、独自のコンストラクタを定義した場合、Javaはデフォルトの引数なしのコンストラクタを生成しない - とロンボクの@Data注釈を使用することによって、あなたが持っています。

@NoArgsConstructorは、パラメータなしのコンストラクタを生成します。

あなたは明示的しかしロンボクの@NoArgsConstructorは、追加することができます。 これは(あるため、最終的なフィールドから)ことはできません 場合は、コンパイルエラーが 結果代わりに

関連する問題