티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기



클래스를 정의할 때 클래스에 public으로 선언된 정적 팩토리 메서드(static factory method) 를 추가하는 것을 고려해본다.

public static Boolean valueOf (boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }

장점1) 생성자와 달리 정적 팩터리 메서드에는 이름(name)이 있다.
 - 가독성에 도움이 된다.
  ex) 소수일 가능성이 높은 BigInteger 객체를 생성하는 생성자 BigInteger(int, int, Random) -> 
        BigInteger.probablePrime 과 같이 사용하면 이해하기 쉬울 것 
 - 클래스의 시그니처 별로 하나의 생성자만 넣을 수 있는 제약을 피할 수 있다.
  ex) A(int, double) , A(double, int) 와 같이 생성자를 만들 경우 코드를 읽고 사용하는데 매우 힘들            다. 정적 팩터리 메서드를 여러개 만들면 이름으로 구별할 수 있다.

 장점2) 생성자와는 달리 호출할 때마다 새로운 객체를 생성할 필요가 없다. 
  - 변경 불가능 클래스라면 이미 만들어둔 객체를 사용할 수 있다.
  - 변경이 불가능한 클래스라면 a == b 일 때만, a.equals(b) 가 참이되도록 만들 수 있다.
     => == 을 사용할 경우 equals 를 사용할 때 보다 성능향상. (?) 성능향상이 얼마나 되길래...

 장점3) 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.
   - 반환되는 객체의 클래스를 유연하게 결정 가능
     ex) java.util.EnumSet 의 경우 public 생성자는 존재하지 않고 모두 정적 팩터리 메소드를 사용하               는데 EnumSet  안에 상수의 개수가 64개 이하일 경우 RegularEnumSet 을 반환하고 64개 초             과일 경우 JumboEnumSet 을 반환하는데 이때 사용하는 사람은 RegularEnumSet 인지 
           JumboEnumSet 인지 알지 않고 사용할 수 있다.
   
  장점4) 형인자 자료형 (parameterized type) 객체를 만들 때 편하다.
   -  컴파일러가 형인자를 스스로 알아내도록 할 수 있다.

Map<String, List<String>> m = new HashMap<String, List<String>>();

   위와 같은 코드를 다음과 같이 수정 할 수 있다.

public static <K, V> HashMap<K, V> newInstance() { return new HashMap<K, V>(); } Map<String, List<String>> m = HashMap.newInstance();

  단점1) public 이나 protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다.

  단점2) 정적 팩터리 메서드가 다른 정적 메서드와 확연히 구분되지 않는다.
    - valueOf() vs of() vs getInstance() vs getType() vs newInstance()


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함