[JAVA] Les @Value et @Data de Lombok ne génèrent pas de constructeur si un autre constructeur explicite est déclaré

C'est quoi l'histoire

J'ai presque écrit ce que je voulais dire dans le titre. Tout ce que je veux dire dans cet article, c'est:

C'est le comportement de Lombok 1.16.18.

Utilisation normale

import lombok.*;

@Data
public class Test {

	private final int value1;

	private final int value2;

	public static void main(String[] args){
		new Test(1, 1);
	}
}

Dans ce cas, @Data regroupe @RequiredArgsConstructor, donc un constructeur est généré et compilé.

Cas où aucun constructeur n'est généré

Cependant, cet ensemble @RequiredArgsConstructor ne générera un constructeur que s'il n'y a pas de déclaration de constructeur explicite. Il s'agit d'un comportement normal tel que décrit dans la documentation.

(except that no constructor will be generated if any explicitly written constructors already exist). Cité de @Data

Exemple (déclaration de constructeur explicite)

Par exemple, le code suivant ne sera pas compilé.

import lombok.*;

@Data
public class Test {

	private final int value1;

	private final int value2;

	public static void main(String[] args){
		new Test(1, 1);
	}

	//Constructeur explicite
	public Test() {

	}
}

Exemple (génération de constructeur par annotation)

De même, si vous ajoutez une annotation qui crée un constructeur tel que @NoArgsConstructor, @Data ne générera pas le constructeur. Par conséquent, le code suivant ne sera pas compilé.

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);
	}
}

Avec à la fois @Data et @Value, @AllArgsConstructor semble gagner.

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); //Cela passe
		new Test(); //Cela ne passe pas
	}
}

J'ai également essayé le constructeur explicite + @ Data + @ Value, mais aucun d'entre eux n'a été généré.

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);
	}

	//Constructeur explicite
	public Test(int i){

	}
}

Recommended Posts

Les @Value et @Data de Lombok ne génèrent pas de constructeur si un autre constructeur explicite est déclaré
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Que faire si le point d'arrêt est grisé et ne s'arrête pas pendant le débogage