lombok을 사용하여 기존 개체에서 개체 만들기


105

다음과 같은 롬복 주석이 달린 클래스가 있다고 가정 해 보겠습니다.

@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 문서에서 이것을 찾을 수 없습니다.

답변:


232

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 ()라는 클래스의 인스턴스 메소드 이 인스턴스의 모든 값으로 시작하는 새 빌더를 만듭니다.

면책 조항 : 저는 롬복 개발자입니다.


12
@Mustafa 또한 @Wither단일 필드 변경에 더 효율적인 Foo f1 = f0.withX(42).
maaartinus

@maaartinus @Wither기존 개체의 필드를 설정하는 대신 항상 새 개체를 반환하는 with * 메서드를 생성 한다고 생각 합니다. 이것은 효율성이 낮습니다.
MGhostSoft

3
@MGhostSoft 나는 분명히 새로운 객체를 만드는 것이 목표라고 가정하고 있습니다. 따라서 불변 객체가 점점 더 많이 사용됨에 따라 우리는 매우 일반적입니다. ++ × 단일 필드를 변경하는 @Wither것이 가장 좋습니다. 둘 이상이 toBuilder승리합니다. 아래 내 대답을 참조하십시오.
maaartinus

2
그리고 제로 필드의 경우 (즉, 변경 사항이없는 객체 복사) @Wither전혀 작동하지 않지만 작동 .toBuilder().build()합니다.
M. Justin

40

기존 객체를 템플릿으로 사용하고 속성 중 하나 를 변경하여 Foo의 객체를 쉽게 생성 할 수있는 방법이 있습니까? ( 강조 광산 )

정말로 단일 속성을 변경하고 싶다면 더 멋지고 효율적인 방법이 있습니다.

@With
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

위더는 쓰레기를 만들지 않지만 단일 필드 만 변경할 수 있습니다. 많은 필드를 변경하려면 다음을 사용할 수 있습니다.

withA(a).withB(b).withC(c)....

엄청난 양의 쓰레기 (모든 중간 결과)를 생성하지만 toBuilder더 효율적이고 자연 스럽습니다.

참고 : 이전 버전의 lombok은 @Wither주석 을 사용했습니다 . 설명서의 시작 부분을 참조하십시오 .


1
정말 그렇게 많은 쓰레기를 만들까요? 대체하려는 필드를 제외하고는 모두 얕은 복사본이라고 생각합니다 (원하는 경우 이미 개체를 불변으로 만들 것이라는 개념에 의존). "가비지"는 대부분 폐기 된 최상위 객체의 참조가됩니다 (하지만 많은 기본 요소가 더 많은 가비지를 초래할 수 있다고 생각하지만).
jm0

1
@ jm0 물론입니다. 모두 얕은 복사본입니다. "쓰레기 톤"이란 n-1일련의 n호출에 대한 객체를 의미 했습니다 withSomething. 객체의 비용은 몇 바이트에 참조 당 4 또는 8 바이트에 기본 요소 당 1-8 바이트를 더한 것과 같습니다. 그래서 우리는 호출 당 수십 바이트에 대해 이야기하고 있습니다. 일반적으로 큰 문제는 아닙니다.
maaartinus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.