"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Setters et un Record en Java

Setters et un Record en Java

Publié le 2024-11-08
Parcourir:153

Setters en un Record en Java

Un record est une structure qui se caractérise par être immuable, c'est-à-dire une fois qu'un objet de type record a été créé. ses attributs ne sont pas modifiables, c'est l'équivalent de ce que d'autres langages de programmation appellent data-class ou DTO (Data Transfer Object). Cependant, si un attribut doit être modifié à l'aide d'une méthode setter et en considérant que chaque attribut de l'enregistrement est de type final, comment y parvenir ?

Pour montrer si cela est possible, créons un enregistrement Produit qui a deux attributs nom et prix, et les méthodes respectives qui sont automatiquement créées lors de la définition d'un enregistrement en Java :

public record Product(String name, double price) { }

Maintenant, si vous créez un objet de type Product et essayez de modifier l'attribut name, vous pouvez voir que ce n'est pas possible, et il n'y a même pas de méthode setter pour le faire :

Product p = new Product("Bread", 1.0);
p.setName("Water"); // Error: cannot resolve method 'setName' in 'Product'

Mais, si nous savons qu'un record peut avoir des méthodes supplémentaires, nous pouvons alors créer une méthode setName(String name) qui modifie l'attribut name et attribue la nouvelle valeur, car la réponse est non, cela ne fonctionne pas comme dans une classe normale, par exemple :

public record Product(String name, double price) {
    // Error: cannot asign a value to final variable 'name'
    public void setName(String name) {
        this.name = name;
    }
}

Alors, comment pouvez-vous modifier un attribut d'un enregistrement en Java ? La réponse est que c'est possible si la méthode set renvoie une nouvelle instance de record avec chacun de ses attributs et évidemment avec le ou les attributs modifiés. Ce processus peut être un peu fastidieux en fonction du nombre d'attributs que possède record.
.

public record Product(String name, double price) {

    public Product setName(String name) {
        return new Product(name, this.price);
    }

    public Product setPrice(double price) {
        return new Product(this.name, price);
    }

}

De cette manière, lors de l'appel de l'une des méthodes setter, une nouvelle instance du type Product avec l'attribut modifié sera obtenue, par exemple :

Product p = new Product("Bread", 1.0);
Product q = p.setName("Milk");
Product r = q.setPrice(2.0);

Pour chaque objet p, q et r, ses méthodes get, equals, hashCode et toString peuvent être invoquées normalement, en considérant qu'aucun des objets n'est égal à l'autre, puisque chacun a une valeur différente dans ses attributs.

public class Main {
    public static void main(String[] args) {
        Product p = new Product("Bread", 1.0);
        Product q = p.setName("Milk");
        Product r = q.setPrice(2.0);

        System.out.println(p); // Product[name=Bread, price=1.0]
        System.out.println(q); // Product[name=Milk, price=1.0]
        System.out.println(r); // Product[name=Milk, price=2.0]

        System.out.println(p.equals(q)); // false
        System.out.println(q.equals(r)); // false
        System.out.println(r.equals(p)); // false
    }
}

À ce stade, il est important de déterminer si cette approche est appropriée au problème à résoudre, étant donné qu'un enregistrement est conçu pour être une structure qui permet de stocker et de transporter des informations de manière simple. manière au sein d'une application et être immuable, ou si une structure avec une plus grande flexibilité est requise, alors une classe doit être utilisée. Pour plus d'informations sur quand utiliser un enregistrement ou une classe, vous pouvez consulter l'article suivant.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/asjordi/setters-en-un-record-en-java-4fb6?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3