반응형

2장 객체 생성과 파괴

 

아이템 1. 생성자 대신 정적 팩토리 메서드를 고려하라

 

정적 팩토리 메서드

정의 : 클래스의 인스턴스를 반환하는 정적 메서드

특징 )

  • 장점

    • 이름을 가질 수 있다.

      • 반환 객체의 특성을 쉽게 묘사
      • 시그니처가 같은 생성자 여러 개 생성 가능
    • 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.

      • 불필요한 객체 생성 회피
      • 플라이웨이트 패턴과 유사
      • 인스턴스 통제 클래스 ➡️ 싱글턴, 인스턴스화 불가, 불변 값 클래스
    • 반환 타입의 하위 타입 객체를 반환할 수 있다.

      • 동반 클래스 => Java 8부터 인터페이스에 정적 메서드 허용
    • 입력 매개변수에 따라 다른 클래스 객체를 반환할 수 있다.

      • 클라이언트는 팩토리가 건네주는 객체가 어느 클래스의 인스턴스인지 알 필요없이 하위 클래스이기만 하면 된다.
    • 정적 팩토리 메서드를 작성하는 시점에 반환할 객체의 클래스가 존재하지 않아도 된다.

      • 서비스 제공자 프레임워크를 만드는 근간

      * 서비스 제공자 프레임워크 핵심 컴포넌트 : 서비스 인터페이스, 제공자 등록 API, 서비스 접근 API, 서비스 제공자 인터페이스

      ex ) JDBC - 서비스 인터페이스 : Connection, 제공자 등록 API : DriverManager.registerDriver, 서비스 접근 API : DriverManager.getConnection, 서비스 제공자 인터페이스 : Driver

  • 단점

    • 정적 팩토리 메서드만 제공하면 하위 클래스를 만들 수 없다. => 컴포지션 사용 유도, 불변 타입으로 만들 경우 지켜야하는 제약

    • 프로그래머가 찾기 힘들다. => 흔히 사용하는 명명 방식 사용

      • from( ) : 매개변수를 하나 받는 형변환 메서드
      • of( ) : 여러 매개변수를 받는 집계 메서드
      • valueOf( ) : from( )과 of( )의 더 자세한 버전
      • getInstance( ) : 인스턴스 반환 ( 동일 인스턴스 보장 X )
      • newInstance( ) : 새로운 인스턴스 반환
      • getType( ) : Type 클래스 인스턴스 반환
      • newType( ) : 새로운 Type 클래스 인스턴스 반환
      • type( ) : getType( )과 newType( )의 간결한 버전

 

Java version

  • Java 6 : 범용 서비스 제공자 프레임워크 (java.util.ServiceLoader) 제공
  • Java 8 : 인터페이스에서 public 정적 멤버 허용
  • Java 9 : private 정적 메서드 허용 (단, 정적 필드와 정적 멤버 클래스는 public)

 

정리

정적 팩토리 메서드와 public 생성자의 장단점을 이해하고 사용하자.

 

TODO

  • 플라이웨이트 패턴
  • 인스턴스 통제 클래스
  • 동반 클래스
  • 리플렉션
  • 서비스 제공자 프레임워크
  • 브리지 패턴
반응형

'Java > OOP' 카테고리의 다른 글

[Effective Java] 2장. 아이템6  (0) 2022.07.18
[Effective Java] 2장. 아이템5  (0) 2022.07.17
[Effective Java] 2장. 아이템4  (0) 2022.07.16
[Effective Java] 2장. 아이템3  (0) 2022.07.16
[Effective Java] 2장. 아이템2  (0) 2022.07.15

+ Recent posts