[JAVA] Lomboks @Value und @Data generieren keinen Konstruktor, wenn ein anderer expliziter Konstruktor deklariert ist

Worum geht "s

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.

Normaler Gebrauch

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.

Fall, in dem kein Konstruktor generiert 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

Beispiel (explizite Konstruktordeklaration)

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() {

	}
}

Beispiel (Generierung des Konstruktors durch Annotation)

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){

	}
}

Recommended Posts

Lomboks @Value und @Data generieren keinen Konstruktor, wenn ein anderer expliziter Konstruktor deklariert ist
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Was tun, wenn der Haltepunkt schattiert ist und beim Debuggen nicht stoppt?