Les Enregistrements Java (Records)

Définition d'un Record

Un Record en Java est une classe spéciale conçue pour représenter des données immuables. Il génère automatiquement le code nécessaire pour la création, l'accès, la comparaison et la représentation textuelle des données, d'où son surnom de "classe de données". Les instances d'un Record stockent des données fixées lors de leur initialisation et ne peuvent plus être modifiées par la suite.

Syntaxe de base

La déclaration d'un Record suit ce schéma :

public record NomDuRecord(ListeDesAttributs) {
}

// Exemple concret
public record Coordonnee(int abscisse, int ordonnee) {
}

Caractéristiques techniques sous-jacentes

  • Un Record est fondamentalement une classe.
  • Les attributs spécifiés entre parenthèses sont automatiquement déclarés comme private final.
  • Un constructeur public paramétré est généré par défaut, affectant les paramètres aux attributs correspondants.
  • Des méthodes d'accès (getters) sont créées automatiquement, utilisant directement le nom des attributs.
  • Les méthodes toString(), equals() et equals() sont redéfinies pour refléter le contenu des attributs.
  • Pour respecter les conventions Java, hashCode() est également redéfini en cohérence avec equals().

Contenu autorisé à l'intérieur d'un Record

  • Seuls les attributs static peuvent être ajoutés.
  • Des constructeurs personnalisés sont permis, mais ils doivent appeler le constructeur canonique via this().
  • Des méthodes peuvent être définies, sans modification des attributs d'instance.
  • Des blocs d'initialisation static sont acceptés, mais les blocs d'initialisation d'instance sont interdits.
  • Des classes internes (membres ou anonymes) peuvent être incluses.

Héritage et implémentation

  • Un Record ne peut pas hériter d'une autre classe via extends, car il étend déjà java.lang.Record.
  • Les Records sont automatiquement déclarés final, empêchant toute sous-classification.
  • L'interface Serializable est implémentée nativemnet, permettant la sérialisation.
  • Plusieurs interfaces peuvent être implémentées simultanément.

Scénario d'utiliastion typique

Les Records sont idéaux pour transmettre des données sous forme d'objets immuables. Par exemple, pour représenter un point géométrique avec des coordonnées x et y, on peut l'instancier, lire ses champs et l'utiliser dans des collections sans crainte de modification accidentelle.

Vérifier si une classe est un Record

En utilisant l'API de réflexion, on obtient l'objet Class de la classe, puis on appelle la méthode isRecord() qui retourne un booléen.

Exemple de code illustratif

public record Personne(String nom, int age, long telephone) {
}

public class Application {
    public static void main(String[] args) {
        Personne individu1 = new Personne("Sophie", 30, 987654321L);
        Personne individu2 = new Personne("Sophie", 30, 987654321L);
        
        boolean egalite = individu1.equals(individu2);
        int hash1 = individu1.hashCode();
        int hash2 = individu2.hashCode();
        
        System.out.println("Égalité : " + egalite);
        System.out.println("Hash codes : " + hash1 + " et " + hash2);
    }
}

Ce code produit la sortie :

Égalité : true
Hash codes : 123456789 et 123456789

(Les valeurs de hash codes spécifiques peuvent varier, mais elles seront identiques pour les deux instances.)

Étiquettes: Java Records Immutabilité sérialisation réflexion

Publié le 23 juin à 21h42