Ich hätte fast geschrieben, was ich im Titel sagen wollte. Alles, was ich in diesem Artikel sagen möchte, ist:
Es ist das Verhalten in Lombok 1.16.18.
import lombok.*;
@Data
public class Test {
private final int value1;
private final int value2;
public static void main(String[] args){
new Test(1, 1);
}
}
In diesem Fall bündelt @Data @RequiredArgsConstructor, sodass ein Konstruktor generiert und kompiliert wird.
Dieser gebündelte @RequiredArgsConstructor generiert jedoch nur dann einen Konstruktor, wenn keine explizite Konstruktordeklaration vorhanden ist. Dies ist normales Verhalten, wie in der Dokumentation beschrieben.
(except that no constructor will be generated if any explicitly written constructors already exist). Zitiert aus @Data
Der folgende Code wird beispielsweise nicht kompiliert.
import lombok.*;
@Data
public class Test {
private final int value1;
private final int value2;
public static void main(String[] args){
new Test(1, 1);
}
//Expliziter Konstruktor
public Test() {
}
}
Wenn Sie eine Anmerkung hinzufügen, die einen Konstruktor wie @NoArgsConstructor erstellt, generiert @Data den Konstruktor ebenfalls nicht. Daher wird der folgende Code nicht kompiliert.
import lombok.*;
@NoArgsConstructor
@Data
public class Test {
private final int value1;
private final int value2;
public static void main(String[] args){
new Test(1, 1);
}
}
Mit @Data und @Value scheint @AllArgsConstructor zu gewinnen.
import lombok.*;
import java.util.Arrays;
@Data
@Value
public class Test {
int value1;
int value2;
public static void main(String[] args){
Arrays.stream(Test.class.getConstructors()).forEach(System.out::println);
new Test(1, 1); //Das geht vorbei
new Test(); //Dies geht nicht vorbei
}
}
Ich habe auch den expliziten Konstruktor + @ Data + @ Value ausprobiert, aber keiner der Konstruktoren wurde generiert.
import lombok.*;
import java.util.Arrays;
@Value
@Data
public class Test {
int value1;
int value2;
public static void main(String[] args){
Arrays.stream(Test.class.getConstructors()).forEach(System.out::println);
}
//Expliziter Konstruktor
public Test(int i){
}
}