본문 바로가기

java/이펙티브 자바

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

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

 

정적 팩터리 메서드는

디자인 패턴에 없다.

 

생성자 VS 정적 팩터리 메서드 ....... 장점  
이름을 가질 수 있다
probablePrime
생성자는 이름이 없다.
매개변수 갯수로 오버로딩되어 구분할 뿐...
public class BigInteger {
        BigInteger(int, int, Random){ ..... } // 생성자
}

정적 팩터리 메서드는 이름만 잘 지으면
반환 될 객체의 특성을 쉽게 묘사할 수 있다.
public class BigInteger {
        BigInteger(int, int, Random){ ..... } // 생성자
        void probablePrime( ){.......} // 메서드 선언  
}
호출 될 때 마다 인스턴스를 새로 생성하지 않아도 된다. 불변 클래스는 인스턴스를 미리 만들어 놓거나
새로 생성한 인스턴스를 재활용한다.

ex) Boolean.valueOf(boolean) 객체를  생성하지 않는다

반환 타입의 하위 타입 객체를 반환 할 수 있는 능력 반환할 객체의 클래스를 자유롭게 선택할 수 있다.

API 만들때
구현 클래스를 공개하지 않고 객체를 반환할 수 있다.

?????동반 클래스?????
자바8: 인터페이스가 정적 메서드를 가질 수 있게 됨

동반 클래스에 두었던== public 정적 멤버들
인터페이스에 두면 된다...

입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 반환 타입의 하위 타입이기만 하면 된다.
원소가 64개 이하 : long RegularEnumSet 인스턴스 반환
원소가 65개 이상: long[] JumboEnumSet 인스턴스 반환
정적 팩터리 메서드를 작성하는 시점
반환할 객체의 클래스가 존재하지 않아도 된다.
유연함
 

 

 

생성자 VS 정적 팩터리 메서드 ....... 단점  
상속을 하려면 pubic, protected 생성자가 필요함
정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다
 
정적 팩터리 메서드는 개발자가 찾기 어렵다  

 

'java > 이펙티브 자바' 카테고리의 다른 글

Item29~30  (0) 2022.01.09
[item 21~22]  (0) 2022.01.01
[item 17~18]  (0) 2021.12.29
[item 8] finalizer와 cleaner 사용을 피하라  (0) 2021.12.26
[item 7] 다 쓴 객체 참조를 해제하라  (0) 2021.12.26