Définir le constructeur par défaut pour l'enregistrement

20

J'ai un enregistrement et je veux y ajouter un constructeur par défaut.

public record Record(int recordId) {
   public Record {

   }
}

Mais il a créé un constructeur avec intparam.

public final class Record extends java.lang.Record {
    private final int recordId;
    public Record(int);
    //other method
}

Comment ajouter un constructeur par défaut à un enregistrement?

Code_Mode
la source
ce que vous avez défini est un constructeur compact qui obtient sa déclaration dérivée de l'en-tête d'enregistrement. Il existe une correspondance 1-1 dans le nom, le type et l'arité variable entre un composant d'enregistrement et le paramètre formel correspondant dans le constructeur compact, il en va de même pour le constructeur canonique. Un enregistrement ne peut avoir qu'un constructeur canonique. S'il est déclaré, le constructeur compact est le constructeur canonique
Vicente Romero

Réponses:

18

Pour diviser les cheveux, vous ne pouvez jamais définir un constructeur par défaut, car un constructeur par défaut est généré par le compilateur quand aucun constructeur n'est défini, donc tout constructeur défini n'est par définition pas un constructeur par défaut.

Si vous voulez qu'un enregistrement ait un constructeur sans argument, les enregistrements permettent d'ajouter des constructeurs supplémentaires ou des méthodes d'usine , tant que le "constructeur canonique" qui prend tous les champs d'enregistrement comme arguments est appelé.

public record Record(int recordId) {
   public Record() {
      this(0); 
   }
}
ThisIsNoZaku
la source
17

Constructeur explicite

Dans votre cas, vous pouvez spécifier explicitement un constructeur sans argument avec la délégation au constructeur canonique avec une valeur par défaut si vous le souhaitez et cela peut être fait comme -

public Record(){
    this(Integer.MIN_VALUE);
}

En bref, tout constructeur non canonique devrait déléguer à un, et cela devrait être vrai pour la nature porteuse de données de ces représentations.

Constructeur compact

En revanche, notez que la représentation que vous aviez utilisée dans votre code.

public Record {}

est appelé un "constructeur compact" qui représente un constructeur acceptant tous les arguments et qui peut également être utilisé pour valider les données fournies en tant qu'attributs de l'enregistrement. Un constructeur compact est une autre façon de déclarer le constructeur canonique.

Naman
la source