Setters et un Record en Java
Oct 22, 2024 am 06:07 AMUn 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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation?

Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance?

Comment puis-je implémenter des techniques de programmation fonctionnelle en Java?

Node.js 20: Boosts de performances clés et nouvelles fonctionnalités

Iceberg: L'avenir des tables de Data Lake

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux?

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave?
