web-dev-qa-db-fra.com

lombok @Data se plaint "lombok a besoin d'un constructeur par défaut dans la classe de base", lorsque la classe abstraite a un champ final

@Data
public abstract class B {
   private final String str;
}

@Data
public class A extends B{
   private final String s;
}

Les données sur la classe A se plaignent dans intellij, mais les codes peuvent être compilés avec succès via la ligne de commande, je ne sais pas quoi faire

3
Richard

Un problème est que @Data est destiné aux données mutables et il n'y a rien de mutable dans vos classes. Donc, en utilisant @Data est tout simplement faux ... et qu'il compile ou non n'a pas vraiment d'importance.

Si vous souhaitez des données modifiables, supprimez le champ final. Pour les données immuables, créez tous les champs final et utilisez @Value. Parfois, des données partiellement modifiables sont nécessaires, mais je m'efforce de les éviter car elles sont déroutantes (certains champs peuvent être définis, d'autres pas) et ils présentent des inconvénients pour les deux.


L'autre problème est que Lombok ne peut pas accéder aux hiérarchies de classes. Avec B ayant un champ final, vous devez l'initialiser dans le constructeur, ce qui signifie que le constructeur de A doit appeler un constructeur non par défaut. Ce n'est pas possible avec Lombok. Il y a @Superbuilder dans Lombok, qui est la seule caractéristique de Lombok qui gère bien les hiérarchies de classes.

0
maaartinus