다음과 같은 롬복 주석이 달린 클래스가 있다고 가정 해 보겠습니다.
@Builder
class Band {
String name;
String type;
}
나는 내가 할 수 있다는 것을 안다.
Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();
기존 객체를 템플릿으로 사용하고 속성 중 하나를 변경하여 Foo의 객체를 생성하는 쉬운 방법이 있습니까?
다음과 같은 것 :
Band nirvana = Band.builder(rollingStones).name("Nirvana");
lombok 문서에서 이것을 찾을 수 없습니다.
답변
toBuilder
매개 변수를 사용하여 인스턴스에 toBuilder()
메서드 를 제공 할 수 있습니다 .
@Builder(toBuilder=true)
class Foo {
int x;
...
}
Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();
에서 문서 :
@Builder를 사용하여 자체 클래스의 인스턴스를 생성하기 위해 빌더를 생성하는 경우 (자신의 유형을 반환하지 않는 메서드에 @Builder를 추가하지 않는 한 항상 그렇습니다) @Builder (toBuilder = true)를 사용하여 생성 할 수도 있습니다. toBuilder ()라는 클래스의 인스턴스 메소드 이 인스턴스의 모든 값으로 시작하는 새 빌더를 만듭니다.
면책 조항 : 저는 롬복 개발자입니다.
답변
기존 객체를 템플릿으로 사용하고 속성 중 하나 를 변경하여 Foo의 객체를 쉽게 생성 할 수있는 방법이 있습니까? ( 강조 광산 )
정말로 단일 속성을 변경하고 싶다면 더 멋지고 효율적인 방법이 있습니다.
@With
class Band {
String name;
String type;
}
Band nirvana = rollingStones.withName("Nirvana");
위더는 쓰레기를 만들지 않지만 단일 필드 만 변경할 수 있습니다. 많은 필드를 변경하려면 다음을 사용할 수 있습니다.
withA(a).withB(b).withC(c)....
엄청난 양의 쓰레기 (모든 중간 결과)를 생성하지만 toBuilder
더 효율적이고 자연 스럽습니다.
참고 : 이전 버전의 lombok은 @Wither
주석 을 사용했습니다 . 설명서의 시작 부분을 참조하십시오 .