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.
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:
Dieser Ansatz funktioniert zwar gut, erfordert jedoch das Schreiben von Boilerplate-Code für Konstruktoren, Getter und manchmal auch Equals-, HashCode- und toString-Methoden.
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:
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:
Dadurch wird Ihre Klassendefinition auf nur die Felder reduziert, wobei der gesamte erforderliche Code automatisch generiert wird.
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 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() + ")"; } }
Während Lombok das Erstellen unveränderlicher Klassen vereinfacht, ist es wichtig, einige potenzielle Fallstricke zu beachten:
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:
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!