반응형
@Builder.ObtainVia
@Builder를 사용하여 여러분이 만든 클래스의 인스턴스를 생성하는 빌더를 만들 때
(이것은 메서드에 @Builder를 추가하지 않는 한 항상 해당됩니다),
@Builder(toBuilder = true)를 사용하여 이 클래스 내부에 toBuilder()라는 이름의 인스턴스 메서드도 생성할 수 있습니다.
이 메서드는 현재 인스턴스의 모든 값으로 시작하는 새로운 빌더를 만듭니다.
또한 매개변수(생성자 또는 메서드의 경우)나 필드(타입에 @Builder를 사용하는 경우)에
@Builder.ObtainVia 주석을 넣어서 해당 필드/매개변수의 값을 이 인스턴스에서 가져오는 대체 수단을 나타낼 수 있습니다.
예를 들어 메서드를 지정할 수 있습니다: @Builder.ObtainVia(method = "calculateFoo").
- 즉, 특정 필드에 대해 메서드를 지정하여 값을 가공할 수 있다.
예제 코드
@Builder 객체
- @Setter 를 사용하지 않고, @Builder 패턴을 사용하였다
- 생성자는 @NoArgs-, @AllArgs- 만 지정하였다
@Getter
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String firstName;
private String lastName;
private int age;
@Builder.ObtainVia(method = "calculateFullName")
private String fullName;
public String calculateFullName() {
if (this.fullName != null) {
return this.fullName;
}
return String.join(firstName, " ", lastName);
}
}
- @Builder(toBuilder = true) 설정
- @Builder.ObtainVia(method = "calculateFullName") 설정으로 fullName 데이터 가공
테스트 코드
- build().toBuild().build();
- calculateFullName
- builder 생성 시 fullName 세팅한 경우는 해당 값을 리턴
- builder 생성 시 fullName 세팅하지 않은 경우는 firstName + lastName 리턴
@Test
void BuilderPatternTest1() {
Person person = Person.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.build()
.toBuild()
.build();
assertThat(person.getFullName).isEqualTo("John Doe");
// result : success (true)
}
@Test
void BuilderPatternTest2() {
Person person = Person.builder()
.firstName("John")
.lastName("Doe")
.fullName("Christina")
.age(30)
.build()
.toBuild()
.build();
assertThat(person.getFullName).isEqualTo("John Doe");
// result : fail (false)
assertThat(person.getFullName).isEqualTo("Christina");
// result : success (true)
}
@Builder(toBuilder = true)
- 빌더 객체를 복제하여 새로운 빌더 객체를 생성
- @Builder 는 불변(immutable)한 객체를 생성하는 데 사용되며, 이는 생성된 객체를 변경할 수 없다는 것을 의미
- 하지만, 생성된 객체 일부 필드를 수정하고 새로운 객체를 만들어야 할 때, toBuilder 기능을 사용할 수 있음
- 이렇게 생성된 빌더를 통해 객체 필드를 수정하고, 새로운 객체를 생성할 수 있으며 기존 객체는 변경되지 않고 유지됨
Person person1 = Person.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.build();
// 기존 객체에서 빌더를 사용하여 새로운 객체 생성
Person person2 = person1.toBuilder()
.age(40) // 나이 변경
.build();
더보기
- ObtainVia 기능을 사용할 때는 toBuilder 설정을 해줘야 한다
- 관련 이슈 : https://github.com/projectlombok/lombok/issues/1244
728x90
반응형
'JVM > Java' 카테고리의 다른 글
[Java] 반복문 종류 및 특징 (for, while, do-while) (0) | 2023.11.07 |
---|---|
[Java] 문자열, 객체, 배열 Null Check (0) | 2022.11.18 |
[Lombok] 자주 사용되는 Lombok Annotation 기능정리 (0) | 2022.09.04 |
[Java] 객체 매핑 라이브러리 ModelMapper 살펴보자 (0) | 2022.08.17 |
[Java] Java Stream 활용하여 두 개의 List 객체 비교하기 (0) | 2022.08.16 |
댓글