[이펙티브 자바] 아이템1

hyng·2022년 11월 21일
0

이펙티브 자바

목록 보기
1/13

✅이 붙은 텍스트는 본 내용과는 무관합니다.

생성자 대신 정적 팩터리 메서드를 고려하라.

정적 팩터리 메서드

Comment.of() 메서드는 Comment 객체 참조를 반환해주는데, 이런 메서드를 정적 팩터리 메서드라고 한다.

장점

  1. 이름을 가질 수 있다.
    BigInteger 클래스는 값이 소수인 BigInteger 클래스를 반환하는 probablePrime 메서드를 가지는데 probablePrime은 기본 생성자 BigInteger(int bitLength, Random rnd) 보다 더 반환될 객체의 특성을 제대로 설명할 수 있다.

  2. 호출될 때마다 인스턴스를 새로 생성하지 않을 수 있다.
    클래스를 싱글턴으로 만듦으로써 인스턴스를 통제할 수 있다. 인스턴스 통제는 플라이 웨이트 패턴의 근간이 된다.

    플라이웨이트 패턴(Flyweight pattern)
    인스턴스를 가능한대로 공유시켜 new 연산자를 통한 메모리 낭비를 줄이는 방식.
    https://lee1535.tistory.com/106

  1. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
    EnumSet이라는 추상 클래스는 하위 클래스로 JumboEnumset, RegularEnumSet을 가진다.

    정적 패터리 메서드를 사용하는 클라이언트는 얻은 객체를 인터페이스만으로 다루게 되고 클라이언트는 JumboEnumset, RegularEnumSet 클래스를 알 필요가 없어지게 된다.
enum Animal {
  dog, cat, bird;
}

class Main {
  public static void main(String[] args) {
    EnumSet<Animal> dog = EnumSet.of(Animal.dog, Animal.cat, Animal.bird);
  }
}

✅ 자바 8이전에는 인터페이스가 정적 메서드를 가질 수 없었기 때문에 팩토리 메서드를 생성하기 위해서는 인스턴스화 불가 동반 클래스를 두어야 했지만 자바 8이후부터는 인터페이스가 정적 메서드를 가질 수 있게 되었기 때문에 다음과 같은 처리가 가능해졌다.

interface Animal {
  static Animal Animal(boolean isDog) {
    if (isDog) {
      return new Dog();
    }
    return null;
  }
}
class Dog implements Animal {
}
class Main {
  public static void main(String[] args) {
    Animal animal = Animal.Animal(true);
    System.out.println(animal.getClass());
  }
}

단점

  1. 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.

    정적 팩터리 메서드에 흔히 사용하는 명명 방식들
    from: 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 메서드

    of: 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 메서드

    valueOf: from과 of의 더 자세한 버전
    instance 혹은 getInstance: 매개변수를 받는다면 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지는 않는다.
    create 혹은 newInstance: instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성해 반환함을 보장한다.
    getType: getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. type은 팩터리 메서드가 반환할 객체의 타입

    newType: newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할때 쓴다. type은 팩터리 메서드가 반환할 객체의 타입

    type: getType과 newType의 간결한 버전

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글