[이펙티브 자바] 정적 팩토리 메소드를 고려할 것

Dev. 로티·2022년 1월 13일
1

자바

목록 보기
1/9
post-thumbnail

클래스는 클라이언트에게 public 생성자 대신 정적 팩토리 메소드를 제공할 수 있는데,
여기서 정적 팩토리 메소드란 이름을 가질 수 있는 생성자? 라고 이해하면 편할 것 같습니다.

디자인 패턴에 존재하는 팩토리 메소드 패턴과 정적 팩토리 메소드는 엄연히 다른 것입니다.

정적 팩토리 메소드를 사용함으로써 얻을 수 있는 다양한 장점과 마지막으로 단점을 설명하겠습니다.

먼저 이름을 가진 생성자?를 사용함으로써 반환될 객체의 특성을 나타낼 수 있습니다.

두번째로는 매번 인스턴스를 새로 생성하지 않아도 되고, 불변 클래스를 미리 만들어놓거나 혹은 새로 만든 인스턴스를 캐싱하여 재활용함으로써 불필요한 객체 생성을 피할 수 있습니다.

세번째로 반환 타입의 하위 타입을 반환할 수 있습니다.
(인터페이스를 정적 팩토리 메소드의 반환타입으로 지정할 수도 있음)

마지막으로 입력되는 파라미터에 따라 다른 객체를 반환할 수 있습니다.

[정적 팩토리 메소드 적용 예시(enum type에 적용)]
private final static Map<String, MemberType> typeMap = Arrays.stream(values())
            .collect(Collectors.toMap(MemberType::toString, Function.identity()));

public static MemberType fromStringMemberType(String memberType){
    return typeMap.getOrDefault(memberType, Anonymous);
}




[정적 팩토리 메소드 적용 예시(게시글 생성)]

private Board(String title, String content, Writer writer){
    this.title = title;
    this.content = content;
    this.writer = writer;
}

public static Board of(String title, String content, Writer writer) {
    return new Board(title, content, writer);
}




[정적 팩토리 메소드 적용 예시(회원 생성)]
private Member(AccountType accountType, long accountId, String nickname) {
    this.accountId = accountId;
    this.accountType = accountType;
    this.nickname = nickname;
}

public static Member of(AccountType accountType, long accountId, String nickname){
    return new Member(accountType, accountId, nickname);
}



from : 파라미터 하나를 받아 해당 인스턴스 타입을 반환하는 형변환 메소드

of : 여러 파라미터를 입력받아 적합한 타입의 인스턴스를 반환

~Of : from 과 of의 좀더 상세한 버전

instance or getInstance : 만약 파라미터를 받는다면 명시한 파라미터에 맞게 인스턴스를 반환하지만, 같은 인스턴스가 반환될 것을 보장하진 않는다.

create or newInstance : 매번 새로운 인스턴스를 생성해 반환함을 보장한다.

  • 정적 팩토리 메소드를 활용하지 않고 무작정 public 생성자를 사용해 인스턴스를 생성했던 습관이 있었다. 앞으로 이 습관을 고쳐나가고, 인스턴스 생성에 대해 좀더 고민하며 프로그래밍함으로써 코드의 퀄리티를 높일 것이다.

0개의 댓글