저는 빌더 패턴에 매우 관심이 있습니다. 자주 사용하지만 빌더를 만드는 사람이 충분한 지 잘 모르며, 사용할 수있는 모든 환경에 대해 의구심이 있습니다. .올바른 장소에서 올바른 작성자를 사용하십시오.
Person person = new Person.Builder()
.withName("John")
.withSecondName("Smith")
.withAge(50)
.build();
System.out.println(person);
여기
내 의심의 일부 :
- 당신이 생각하십니까 그것이 정말 그냥 빨리 사용 예를
public class Person { private String name; private String secondName; private int age; public static class Builder { private boolean isBuilt; private Person person = new Person(); private void check() { if (isBuilt) { throw new IllegalStateException( "The object cannot be modified after built"); } } public Builder withName(String name) { check(); person.name = name; return this; } public Builder withSecondName(String secondName) { check(); person.secondName = secondName; return this; } public Builder withAge(int age) { check(); person.age = age; return this; } public Person build() { check(); isBuilt = true; return person; } } @Override public String toString() { return "Name: " + name + "\nSecond name:" + secondName + "\nAge:" + age; } }
: 이 내가 빌더를 만드는 방법의 예입니다 불변의 경우, 어떻게하면 좋습니까?
- 스레드 안전성 정보. 글쎄, 아마도 이것이 나의 주된 의심 일 것이다. 이 스레드가 실제로 안전합니까? 인터넷에서 클래스 수준 변수가 최종적이어야하며 생성자를 통해 전달되어야한다고 예를 보았습니다. 또한 변수가 변수로 선언 된 예제를 보았습니다. 당신이 그것에 대해 어떻게 생각하십니까?
- 이 빌더를 사용할 수있는 시나리오와 관련하여이 빌더에 제한이 있다고 생각합니까? 내 말은 EJB, JSF backing bean, MDB에서 호출되거나 JPA 엔티티가되는 것이 적합할까요?
'빌더'는'Person'과 같은 필드를 가지고 있어야하고'Person'의 모든 필드는'final'이어야합니다. –
나는 이것이 옴니버스 질문 인 것을 좋아하지 않습니다. "내 코드를 어떻게 생각하니?"또는 "어떻게 이름을 지어야하는지"와 같은 주관적인 질문을 제거하는 것도 고려해야합니다. – millimoose
@LouisWasserman이 링크를 한번 보시면 저도 이런 식으로 누군가를 발견했습니다. 중복을 제거하고 싶지만 잘 모릅니다 : http://xavimiro.blogspot.ie/2008/04/new-builder-pattern.html 그는 'volatile'키워드를 권장하지만 스레드 안전에 관해서는 완전히 유효 할 지 확신 할 수 없습니다. – sfrj