Maison  >  Article  >  Java  >  Setters et un Record en Java

Setters et un Record en Java

Barbara Streisand
Barbara Streisandoriginal
2024-10-22 06:07:31153parcourir

Setters en un Record en Java

Un enregistrement est une structure qui se caractérise par être immuable, c'est-à-dire qu'une fois qu'un objet de type enregistrement a été créé, son les attributs ne peuvent pas être modifiés, 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 voyez 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 enregistrement peut avoir des méthodes supplémentaires, alors nous pouvons créer une méthode setName(String name) qui modifie l'attribut name et lui 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 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 du record avec chacun de ses attributs et évidemment avec le ou les attributs modifiés. Ce processus peut être un peu fastidieux selon le nombre d'attributs que possède le enregistrement.

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 façon, lors de l'invocation 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 considérer 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 class doit être utilisée. Pour plus d'informations sur quand utiliser un enregistrement ou une classe, vous pouvez consulter l'article suivant.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Les doutes de JavaArticle suivant:Les doutes de Java