web-dev-qa-db-ja.com

ロンボクのさまざまなコンストラクターの注釈?

クラスがあります

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
barbara

クラスは以下と同等です。

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

    private T data;
}
_

厳密に言うと、これはall変数にtoStringequalshashCodeメソッドを追加します。これにより、無限ループが発生する可能性があります(多くの場合、発生します)。 _@Data_には十分注意してください。

@Accessors(chain = true)は、setter実装がthisを返すようにします。詳細は here です。

複数のコンストラクタアノテーションを追加できます。

他のほとんどのロンボクアノテーションとは異なり、明示的なコンストラクターが存在しても、これらのアノテーションが独自のコンストラクターを生成することは妨げられません。

_@Accessors_は実験的なものであり、将来変更される可能性があることに注意してください。

私は _@Builder_ よりも_@AllArgsConstructor_よりも required パラメータのみを設定できるので、すべての引数のコンストラクタはすべてまたは何もないため、 。また、はるかに読みやすいコードを生成します。

_new Thing(true, 1, 4, false, 4, 4.0)
_

Versus

_new Thing.Builder().
    setANamnedProperty(true).
    setAnotherNamnedProperty(1).
    ....
    build();
_
30

これを試しましたか?

@NoArgsConstructor
@AllArgsConstructor
13
vikingsteve

これを試して。これはうまくいくはずです。この注釈も追加します。

@NoArgsConstructor

@NoArgsConstructorは、パラメーターのないコンストラクターを生成します。これが不可能な場合(最終フィールドのため)、@ NoArgsConstructor(force = true)を使用しない限り、代わりにコンパイラエラーが発生し、すべての最終フィールドは0/false/nullで初期化されます。 @NonNullフィールドなどの制約のあるフィールドの場合、チェックは生成されません。したがって、これらのフィールドが後で適切に初期化されるまで、これらの制約は通常満たされないことに注意してください。特定のJava構成には、引数なしのコンストラクターが必要です。このアノテーションは、@ Dataまたはアノテーションを生成する他のコンストラクターのいずれかと組み合わせて主に役立ちます。

0
kris

はい、Lombokでは両方のコンストラクターを使用できます。

@NoArgsConstructor
@AllArgsConstructor

@ AllArgsConstructorは、注釈付きクラスのすべてのフィールドに引数を必要とするコンストラクタを生成します。

したがって、2つのフィールドを持つEmployeeクラスがあります。

@AllArgsConstructor
public class Employee {

    private String name;
    private int salary;
}

クラスをde-lombokすると、次のようになります。

public class Employee {

    private String name;
    private int salary;

    public Employee(String name, int salary) {
        this.name = name;
        this.salary = salary;
    }
}

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

次のEmployeeクラスがあります。

@NoArgsConstructor   
public class Employee {

    private String name;
    private int salary;
}

生成されたコードを見ると、Lombokが引数なしのコンストラクターを追加していることがわかります。

public class Employee {

    private String name;
    private int salary;

    public Employee() {
    }
}

その他の例

0
Ilya Budu