정적 팩터리 메서드란?
특정 클래스의 인스턴스를 반환하는 단순한 정적 메서드
ex) 박싱클래스 Boolean
/*Boolean의 내부*/
public static Boolean valueOf(String s) {
return parseBoolean(s) ? TRUE : FALSE;
}
정적 팩터리 메서드를 사용했을때의 장점들
1. 네이밍이 가능해진다.
생성자는 네이밍을 할 수가 없기 때문에 메서드만의 뚜렷한 특징을 나타낼 수 있는 방법이 없다.
하지만, 정적 팩터리 메서드는 메서드에 네이밍이 가능함으로 해당 메서드가 나타내는 의미를 바로 catch 할 수 있다.
* 시그니처가 같은 생성자를 여러번 호출이 필요하다면 정적 메서드 패턴을 사용하여 차이를 드러내는 이름을 지어주어 코드 가독성을 높여보자!
2. 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다.
객체 생성하는데 코스트가 큰 경우에는 정적 팩터리 메서드를 사용하여 객체가 여러번 생성되어 성능이 저하되는 것을 막아준다.
플라이 웨이트 패턴(FlyWeight-pattern) : 객체 생성 시 생성할 객체가 이미 만들어져있다면 생성하지 않고 없을때에만 생성
https://palpit.tistory.com/198
3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
반환타입을 하위 타입으로 지정할 수 있음으로써 코드의 유연성을 높여준다.
*자바8이후에는 Interface에도 static 메서드를 사용할 수 있게 된점을 참고하자!
public interface AfterJava8CouldStaticMethodImpl {
static AfterJava8CouldStaticMethodImpl execute(int a, int b){
return new Child();
}
}
4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다.
아래의 예시를 보면 RegularEnumSet과 JumboEnumSet은 EnumSet의 하위 클래스이다.
파라미터가 어떤것을 받느냐에 따라서 해당 객체가 어떤 하위 객체를 리턴할지가 결정된다.
반면, 사용자들은 해당클래스의 존재를 모르고 쓴다.(전혀 문제 되지 않음.)
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
5. 정적 팩터리 메서드를 작성하는 시점에는 반환한 객체의 클래가 존재하지 않아도 된다.
정적 팩터리 메서드를 사용했을때의 단점들
1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
2. 정적 팩터리 메서드는 프로그래머가 찾기 힘들다.
References
|
'Java > Java' 카테고리의 다른 글
(JAVA) 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2019.12.08 |
---|---|
(JAVA) 제네릭의 사용 (0) | 2019.12.08 |
(JAVA) Static (0) | 2019.12.07 |
(JAVA) 내부클래스의 종류 및 사용법 (1) | 2019.12.07 |
(JAVA) 디폴트 생성자(default constructor) (0) | 2019.11.24 |