[2장] 객체 생성과 파괴

Soso K·2022년 10월 17일
0

Effective Java

목록 보기
1/1

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

정적 팩터리 메서드란? 객체의 생성을 역할을 하는 클레스 메서드

클래스는 클라이언트에 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다.

정적 팩토리 메서드가 가지는 장점

  1. 이름을 가질 수 있다
  • 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다.
  • 반면 정적 팩터리는 반환될 객체의 특성을 쉽게 묘사할 수 있다.
  • 하나의 시그니처로는 하나의 생성자만을 만들 수 있다. 한 클래스에 시그니처가 같은 여러 생성자가 필요할 것 같으면, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자.
  1. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
  • 이 덕분에 불변 클래스는 인스턴스를 미리 만들어 놓거나, 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.
    ex) Boolean.valueOf(boolean) 의 경우 객체를 아예 생성하지 않는다.
  1. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
  • 이 장점은 엄청난 유연성을 가지게 되는데, API를 만들 때 이 유연성을 응용하면 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어 API를 작게 유지할 수 있다.
  1. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  • 반환 타입이 하위 타입이기만 하면 어떤 클래스의 객체를 반환하든 상관없다.
  1. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
  • 이렁 유연함은 서비스 제공자 프레임워크를 만드는 근간이 된다. 이 구현체들을 클라이언트에 제공하는 역할을 프레임워크가 통제하여, 클라이언트를 구현체로부터 분리해준다.

이제 단점을 알아보자.

  1. 상속을 사용하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
  • 정적 팩터리 메서드에 흔히 사용되는 명명 방식들
    • from, of, valueOf, getInstance, newInstance, create, getType, newType, type

출처

이펙티브 자바 - 조슈아 블로크 지음

profile
새싹 개발자

0개의 댓글