web-dev-qa-db-fra.com

Annotation pour différents constructeurs à Lombok?

J'ai un cours

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

que je veux simplifier avec Lombok.

Si j'ajoute une annotation @AllArgsConstructor que je ne peux pas voir le constructeur par défaut.

@Data
@AllArgsConstructor
public class Answer<T> {
    private T data;

    public Answer<T> setData(T data) {
        this.data = data;
        return this;
    }
}

Est-il possible d'avoir les deux constructeurs dans Lombok?

17
barbara

Votre classe équivaut à:

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

    private T data;
}

Bien qu'à proprement parler, cela ajoute les méthodes toString, equals et hashCode sur toutes les variables . Cela peut (et fait souvent) provoquer des boucles infinies. Faites très attention à @Data.

@Accessors(chain = true) fait que les implémentations setter retournent this, plus d'infos ici .

Vous pouvez ajouter plusieurs annotations de constructeur:

Contrairement à la plupart des autres annotations lombok, l'existence d'un constructeur explicite n'empêche pas ces annotations de générer leur propre constructeur.

Notez que @Accessors Est expérimental et peut être modifié/renommé à un moment ultérieur.

Je préfère @Builder à @AllArgsConstructor Car il ne permet de définir que les paramètres requis, alors qu'un constructeur all arguments est tout ou rien . Il génère également du code beaucoup plus lisible, considérez

new Thing(true, 1, 4, false, 4, 4.0)

Versus

new Thing.Builder().
    setANamnedProperty(true).
    setAnotherNamnedProperty(1).
    ....
    build();
30
Boris the Spider

Avez-vous essayé cela?

@NoArgsConstructor
@AllArgsConstructor
13
vikingsteve

Essaye ça. Cela devrait fonctionner. Ajoutez également cette annotation.

@NoArgsConstructor

@NoArgsConstructor va générer un constructeur sans paramètres. Si cela n'est pas possible (en raison des champs finaux), une erreur de compilation se produira à la place, sauf si @NoArgsConstructor (force = true) est utilisé, alors tous les champs finaux sont initialisés avec 0/false/null. Pour les champs avec des contraintes, tels que les champs @NonNull, aucune vérification n'est générée, alors sachez que ces contraintes ne seront généralement pas remplies tant que ces champs ne seront pas correctement initialisés ultérieurement. Certaines constructions Java, telles que hibernate et l'interface du fournisseur de services nécessitent un constructeur sans argument. Cette annotation est utile principalement en combinaison avec @Data ou l'un des autres constructeurs générant des annotations.

0
kris

Oui, vous pouvez utiliser les deux constructeurs à Lombok.

@NoArgsConstructor
@AllArgsConstructor

@ AllArgsConstructor génère un constructeur nécessitant un argument pour chaque champ de la classe annotée.

Nous avons donc la classe Employé avec deux champs:

@AllArgsConstructor
public class Employee {

    private String name;
    private int salary;
}

Lorsque nous dé-lombokons la classe, cela devient:

public class Employee {

    private String name;
    private int salary;

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

@ NoArgsConstructor génère un constructeur par défaut sans paramètres.

Nous avons la classe Employé suivante:

@NoArgsConstructor   
public class Employee {

    private String name;
    private int salary;
}

Lorsque nous regardons le code généré, nous voyons que Lombok ajoute un constructeur sans argument:

public class Employee {

    private String name;
    private int salary;

    public Employee() {
    }
}

Plus d'exemples

0
Ilya Budu