불변 클래스는 본질적으로 스레드로부터 안전하고 추론하기 쉬우며 실수로 객체 상태가 변경되는 것을 방지하므로 유용합니다. 불변 객체의 상태는 생성된 후에는 수정할 수 없으므로 특히 멀티스레드 환경에서 귀중한 디자인 패턴이 됩니다.
다음 Employee 클래스를 고려해보세요.
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; } }
이러한 전통적인 접근 방식은 다음과 같습니다.
이 접근 방식은 잘 작동하지만 생성자, getter, 때로는 equals, hashCode 및 toString 메소드에 대한 상용구 코드를 작성해야 합니다.
Lombok을 사용하면 작성해야 하는 코드의 양을 대폭 줄일 수 있습니다. Lombok으로 동일한 기능을 구현하는 방법은 다음과 같습니다.
import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter final class Employee { private final long id; private final String name; private final double salary; }
이 버전은 Lombok 주석을 사용하여 생성자와 getter를 자동으로 생성합니다.
Lombok의 @Value 주석은 여러 기능을 결합하여 불변 클래스를 생성하는 더욱 강력한 대안입니다.
import lombok.Value; @Value class Employee { long id; String name; double salary; }
@Value를 사용하면 Lombok이 자동으로 다음을 수행합니다.
이렇게 하면 클래스 정의가 필드만으로 줄어들고 필요한 모든 코드가 자동으로 생성됩니다.
불변 객체는 상태 수정을 허용하지 않습니다. 그러나 어떤 경우에는 직원 급여 업데이트와 같이 객체의 수정된 복사본을 생성해야 할 수도 있습니다. Lombok이 없으면 다음과 같습니다.
@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); } }
이것은 간단하지만 지루하며, 특히 필드가 많은 클래스를 다룰 때 더욱 그렇습니다.
Lombok의 @With 주석은 이를 단순화합니다.
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); } }
@With 주석은 지정된 필드가 업데이트된 클래스의 새 인스턴스를 반환하고 나머지는 변경되지 않은 상태로 유지하는 메서드를 생성합니다.
Employee 클래스의 롬보크 해제된 버전(즉, Lombok이 내부적으로 생성하는 것)은 다음과 같습니다.
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() + ")"; } }
Lombok은 불변 클래스 생성을 단순화하지만 몇 가지 잠재적인 함정에 유의하는 것이 중요합니다.
불변성은 상당한 이점을 제공하지만 특히 빈번한 업데이트와 관련된 시나리오에서는 성능에 미치는 영향을 고려하는 것이 중요합니다.
Lombok의 @Value 및 @With 주석은 Java에서 불변 클래스를 생성하는 강력하고 간결한 방법을 제공하므로 상용구 코드가 필요 없으며 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만듭니다. 이러한 주석을 활용하면 클래스 디자인 메커니즘보다는 애플리케이션 논리에 집중할 수 있습니다.
위 내용은 Java 코드 변환: 단 몇 분만에 Lombok을 사용하여 불변성의 힘을 잠금 해제하세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!