Maison Java javaDidacticiel Transformez votre code Java : débloquez la puissance de l'immuabilité avec Lombok en quelques minutes !

Transformez votre code Java : débloquez la puissance de l'immuabilité avec Lombok en quelques minutes !

Aug 26, 2024 am 06:35 AM

Transform Your Java Code: Unlock the Power of Immutability with Lombok in Just Minutes!

Pourquoi des classes immuables ?

Les classes immuables sont bénéfiques car elles sont intrinsèquement thread-safe, faciles à raisonner et empêchent les modifications accidentelles de l'état de l'objet. L'état d'un objet immuable ne peut pas être modifié après sa création, ce qui en fait un modèle de conception précieux, en particulier dans les environnements multithread.

Approche traditionnelle pour créer une classe immuable

Considérez la classe d'employés suivante :

final class Employee {
    private final long id;
    private final String name;
    private final double salary;

    public Employee(long id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }
}
Copier après la connexion

Dans cette approche traditionnelle :

  • La classe est marquée comme finale pour éviter les sous-classements.
  • Tous les champs sont privés et finaux, garantissant qu'ils ne peuvent pas être modifiés après l'initialisation.
  • Seules les méthodes getter sont fournies pour accéder aux valeurs des champs.

Bien que cette approche fonctionne bien, elle implique d'écrire du code passe-partout pour les constructeurs, les getters et parfois les méthodes égales, hashCode et toString.

Utiliser Lombok pour éliminer le passe-partout

Lombok peut réduire considérablement la quantité de code que vous devez écrire. Voici comment vous pouvez obtenir la même fonctionnalité avec Lombok :

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
final class Employee {
    private final long id;
    private final String name;
    private final double salary;
}
Copier après la connexion

Cette version utilise les annotations Lombok pour générer automatiquement le constructeur et les getters :

  • @AllArgsConstructor génère un constructeur avec tous les champs comme paramètres.
  • @Getter génère des méthodes getter pour chaque champ.

Simplifier encore plus avec @Value

L'annotation @Value de Lombok est une alternative plus puissante qui combine plusieurs fonctionnalités pour créer une classe immuable :

import lombok.Value;

@Value
class Employee {
    long id;
    String name;
    double salary;
}
Copier après la connexion

Avec @Value, Lombok automatiquement :

  • Rend le cours final.
  • Rend tous les champs privés et finaux par défaut.
  • Génère un constructeur tous arguments.
  • Génère des getters pour tous les champs.
  • Implémente les méthodes equals, hashCode et toString.

Cela réduit la définition de votre classe aux seuls champs, avec tout le code nécessaire généré automatiquement.

Gestion des mises à jour de champs avec @With

Les objets immuables ne permettent pas de modifier leur état. Cependant, dans certains cas, vous devrez peut-être créer une copie modifiée de l'objet, comme par exemple mettre à jour le salaire d'un employé. Sans Lombok, cela pourrait ressembler à :

@Value
class Employee {
    long id;
    String name;
    double salary;
}

class Main {
    public static void main(String... args) {
        var emp = new Employee(1L, "Aman", 10_000.0);
        emp = updateSalary(emp, 12_0000.0);
    }

    public Employee updateSalary(Employee emp, long newSalary) {
        return new Employee(emp.getId(), emp.getName(), newSalary);
    }
}
Copier après la connexion

C'est simple mais fastidieux, surtout lorsqu'il s'agit de classes qui comportent de nombreux domaines.

L'annotation @With de Lombok simplifie cela :

import lombok.Value;
import lombok.With;

@Value
class Employee {
    long id;
    String name;
    @With double salary;
}

class Main {
    public static void main(String... args) {
        var emp = new Employee(1L, "Aman", 10_000.0);
        emp = updateSalary(emp, 12_0000.0);
    }

    public Employee updateSalary(Employee emp, double newSalary) {
        return emp.withSalary(newSalary);
    }
}
Copier après la connexion

L'annotation @With génère une méthode qui renvoie une nouvelle instance de la classe avec le champ spécifié mis à jour, laissant le reste inchangé.

La version finale dé-lombokée

La version dé-lombokée de notre classe Employee (c'est-à-dire ce que Lombok génère sous le capot) ressemblerait à ceci :

final
class Employee {
    private final long id;
    private final String name;
    private final double salary;

    public Employee(long id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public Employee withSalary(double salary) {
        return this.salary == salary ? this : new Employee(this.id, this.name, salary);
    }

    public long getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public double getSalary() {
        return this.salary;
    }

    @Override
    public boolean equals(final Object o) {
        if (o == this) return true;
        if (!(o instanceof Employee)) return false;
        final Employee other = (Employee) o;
        if (this.getId() != other.getId()) return false;
        final Object this$name = this.getName();
        final Object other$name = other.getName();
        if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
        return Double.compare(this.getSalary(), other.getSalary()) == 0;
    }

    @Override
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final long $id = this.getId();
        result = result * PRIME + (int) ($id >>> 32 ^ $id);
        final Object $name = this.getName();
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        final long $salary = Double.doubleToLongBits(this.getSalary());
        result = result * PRIME + (int) ($salary >>> 32 ^ $salary);
        return result;
    }

    @Override
    public String toString() {
        return "Employee(id=" + this.getId() + ", name=" + this.getName() + ", salary=" + this.getSalary() + ")";
    }
}
Copier après la connexion

Pièges courants lors de l'utilisation de Lombok pour l'immuabilité

Bien que Lombok simplifie la création de classes immuables, il est important de noter certains pièges potentiels :

  • Collections mutables : Si votre classe contient des collections mutables (comme List ou Map), l'annotation @Value de Lombok ne vous protégera pas des modifications de ces collections. Pensez à utiliser des versions immuables comme Collections.unmodifiableList ou List.of() pour l'initialisation.
  • Objets complexes : Si vos champs de classe sont des objets complexes qui sont eux-mêmes mutables, l'immuabilité de la classe est compromise. Assurez-vous que tous les champs sont soit des objets primitifs et immuables, soit correctement encapsulés pour éviter toute mutation.

Considérations relatives aux performances

Bien que l'immuabilité offre des avantages significatifs, il est important de prendre en compte l'impact sur les performances, en particulier dans les scénarios impliquant des mises à jour fréquentes :

  • Utilisation de la mémoire : La création de nouvelles instances chaque fois qu'une modification est nécessaire peut entraîner une utilisation plus élevée de la mémoire. Cependant, ce compromis en vaut souvent la peine en raison des avantages de la sécurité des threads et de la complexité réduite.
  • Garbage Collection : La création de plusieurs objets de courte durée peut exercer une pression supplémentaire sur le garbage collector. Assurez-vous que la gestion de la mémoire de votre application est optimisée pour de tels scénarios.

Conclusion

Les annotations @Value et @With de Lombok offrent un moyen puissant et concis de créer des classes immuables en Java, éliminant le besoin de code passe-partout et rendant votre code plus lisible et maintenable. En tirant parti de ces annotations, vous pouvez vous concentrer sur la logique de votre application plutôt que sur les mécanismes de conception de classe.

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

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)

Sujets chauds

Tutoriel Java
1670
14
Tutoriel PHP
1274
29
Tutoriel C#
1256
24
Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Apr 19, 2025 pm 04:51 PM

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Apr 19, 2025 pm 11:30 PM

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Apr 19, 2025 pm 06:21 PM

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Apr 19, 2025 pm 11:42 PM

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Apr 19, 2025 pm 11:45 PM

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Comment convertir en toute sécurité les objets Java en tableaux? Comment convertir en toute sécurité les objets Java en tableaux? Apr 19, 2025 pm 11:33 PM

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Apr 19, 2025 pm 11:27 PM

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...

Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Apr 19, 2025 pm 11:36 PM

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...

See all articles