Heim >Java >javaLernprogramm >Transformieren Sie Ihren Java-Code: Erschließen Sie die Kraft der Unveränderlichkeit mit Lombok in nur wenigen Minuten!

Transformieren Sie Ihren Java-Code: Erschließen Sie die Kraft der Unveränderlichkeit mit Lombok in nur wenigen Minuten!

WBOY
WBOYOriginal
2024-08-26 06:35:31818Durchsuche

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

Warum unveränderliche Klassen?

Unveränderliche Klassen sind von Vorteil, da sie von Natur aus Thread-sicher sind, leicht zu überdenken sind und versehentliche Änderungen am Objektzustand verhindern. Der Zustand eines unveränderlichen Objekts kann nach seiner Erstellung nicht mehr geändert werden, was es zu einem wertvollen Entwurfsmuster macht, insbesondere in Umgebungen mit mehreren Threads.

Traditioneller Ansatz zur Erstellung einer unveränderlichen Klasse

Betrachten Sie die folgende Mitarbeiterklasse:

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

In diesem traditionellen Ansatz:

  • Die Klasse ist als final markiert, um Unterklassen zu verhindern.
  • Alle Felder sind privat und endgültig, sodass sie nach der Initialisierung nicht geändert werden können.
  • Für den Zugriff auf die Feldwerte werden nur Getter-Methoden bereitgestellt.

Dieser Ansatz funktioniert zwar gut, erfordert jedoch das Schreiben von Boilerplate-Code für Konstruktoren, Getter und manchmal auch Equals-, HashCode- und toString-Methoden.

Mit Lombok Boilerplate eliminieren

Lombok kann die Menge an Code, die Sie schreiben müssen, drastisch reduzieren. So können Sie mit Lombok die gleiche Funktionalität erreichen:

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
final class Employee {
    private final long id;
    private final String name;
    private final double salary;
}

Diese Version verwendet Lombok-Annotationen, um den Konstruktor und die Getter automatisch zu generieren:

  • @AllArgsConstructor generiert einen Konstruktor mit allen Feldern als Parameter.
  • @Getter generiert Getter-Methoden für jedes Feld.

Noch weiter vereinfachen mit @Value

Lomboks @Value-Annotation ist eine leistungsfähigere Alternative, die mehrere Funktionen kombiniert, um eine unveränderliche Klasse zu erstellen:

import lombok.Value;

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

Mit @Value, Lombok automatisch:

  • Macht den Kurs zum Abschluss.
  • Macht alle Felder standardmäßig privat und endgültig.
  • Generiert einen Konstruktor mit allen Argumenten.
  • Generiert Getter für alle Felder.
  • Implementiert die Methoden equal, hashCode und toString.

Dadurch wird Ihre Klassendefinition auf nur die Felder reduziert, wobei der gesamte erforderliche Code automatisch generiert wird.

Umgang mit Feldaktualisierungen mit @With

Unveränderliche Objekte erlauben keine Änderung ihres Zustands. In bestimmten Fällen müssen Sie jedoch möglicherweise eine geänderte Kopie des Objekts erstellen, z. B. um das Gehalt eines Mitarbeiters zu aktualisieren. Ohne Lombok könnte das so aussehen:

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

Dies ist unkompliziert, aber mühsam, insbesondere wenn es um Klassen mit vielen Feldern geht.

Lomboks @With-Annotation vereinfacht dies:

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

Die @With-Annotation generiert eine Methode, die eine neue Instanz der Klasse mit aktualisiertem angegebenen Feld zurückgibt, während der Rest unverändert bleibt.

Die endgültige entlombokte Version

Die delombokierte Version unserer Employee-Klasse (d. h. was Lombok unter der Haube generiert) würde so aussehen:

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() + ")";
    }
}

Häufige Fallstricke bei der Verwendung von Lombok für Unveränderlichkeit

Während Lombok das Erstellen unveränderlicher Klassen vereinfacht, ist es wichtig, einige potenzielle Fallstricke zu beachten:

  • Veränderliche Sammlungen: Wenn Ihre Klasse veränderbare Sammlungen (wie Liste oder Karte) enthält, schützt Sie Lomboks @Value-Annotation nicht vor Änderungen an diesen Sammlungen. Erwägen Sie die Verwendung unveränderlicher Versionen wie Collections.unmodifiableList oder List.of() für die Initialisierung.
  • Komplexe Objekte: Wenn Ihre Klassenfelder komplexe Objekte sind, die selbst veränderbar sind, ist die Unveränderlichkeit der Klasse gefährdet. Stellen Sie sicher, dass alle Felder entweder primitive, unveränderliche Objekte sind oder ordnungsgemäß gekapselt sind, um Mutationen zu verhindern.

Leistungsüberlegungen

Während Unveränderlichkeit erhebliche Vorteile bietet, ist es wichtig, die Auswirkungen auf die Leistung zu berücksichtigen, insbesondere in Szenarien mit häufigen Aktualisierungen:

  • Speichernutzung: Das Erstellen neuer Instanzen jedes Mal, wenn eine Änderung erforderlich ist, kann zu einer höheren Speichernutzung führen. Dieser Kompromiss lohnt sich jedoch oft wegen der Vorteile der Thread-Sicherheit und der geringeren Komplexität.
  • Garbage Collection: Die Erstellung mehrerer kurzlebiger Objekte kann den Garbage Collector zusätzlich belasten. Stellen Sie sicher, dass die Speicherverwaltung Ihrer Anwendung für solche Szenarien optimiert ist.

Abschluss

Lomboks @Value- und @With-Annotationen bieten eine leistungsstarke und prägnante Möglichkeit, unveränderliche Klassen in Java zu erstellen, wodurch Boilerplate-Code überflüssig wird und Ihr Code lesbarer und wartbarer wird. Durch die Nutzung dieser Anmerkungen können Sie sich auf die Logik Ihrer Anwendung statt auf die Mechanik des Klassendesigns konzentrieren.

Das obige ist der detaillierte Inhalt vonTransformieren Sie Ihren Java-Code: Erschließen Sie die Kraft der Unveränderlichkeit mit Lombok in nur wenigen Minuten!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn