Maison Java javaDidacticiel Setters et un Record en Java

Setters et un Record en Java

Oct 22, 2024 am 06:07 AM

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) { }
Copier après la connexion

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'
Copier après la connexion

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;
    }
}
Copier après la connexion

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);
    }

}
Copier après la connexion

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);
Copier après la connexion

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
    }
}
Copier après la connexion

À 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 de ce site Web
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 chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Musée à deux points: toutes les expositions et où les trouver
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Musée à deux points: toutes les expositions et où les trouver
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

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? 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? Mar 17, 2025 pm 05:35 PM

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 Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

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 utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

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? Comment puis-je implémenter des techniques de programmation fonctionnelle en Java? Mar 11, 2025 pm 05:51 PM

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

Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Mar 07, 2025 pm 06:12 PM

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

Iceberg: L'avenir des tables de Data Lake Iceberg: L'avenir des tables de Data Lake Mar 07, 2025 pm 06:31 PM

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 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? Mar 17, 2025 pm 05:43 PM

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? 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? Mar 17, 2025 pm 05:44 PM

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?

See all articles