정적 팩터리 메서드 (static factory method)
클래스는 생성자와 별도로 정적 팩터리 메서드를 제공 할 수 있다.
여기서 말하는 정적 팩터리 메서드는(static factory method) 디자인 패턴에서의 팩토리 메서드 패턴과 다르다.
여기서 말하는 정적 팩터리 메서드 패턴은 생성자를 통해 객체를 생성하는게 아닌 메서드(static method)를 이용해 객체를 생성하는 방식이다.
장단점을 알아보자.
장점
1. 이름을 가질 수 있다.
생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다.
public class ErrorResponse {
String message;
int status;
private ErrorResponse(ErrorCode errorCode) {
this.message = errorCode.getMessage();
this.status = errorCode.getStatus();
}
public static ErrorResponse of(ErrorCode errorCode) {
return new ErrorResponse(errorCode);
}
}
반면 정적 팩터리 메서드는 이름만 메서드의 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사 할 수 있다.
위 코드는 ErrorCode를 받고 그걸 토대로 ErrorResponse 인스턴스를 생성해서 리턴해주는 함수이다.
ErrorResponse response = ErrorResponse.of(SomeErrorCode);
2. 호출될 떄마다 인스턴스를 새로 생성하지 않아도 된다.
어떤 객체의 메서드를 사용하기위해 일일히 new 연산자를 이용해 해당 객체를 인스턴스를 만든 다음 사용하고 그럴 필요가 없으며, 자주 사용하는 값 또는 immutable값을 미리 캐싱해두어 필요할떄마다 호출하여 사용 할 수 있다.
public class SomeCache {
private static SomeCache cache = new SomeCache();
public static SomeCache getCache() {
return cache;
}
}
public class Main {
public static void main(String[] args) {
SomeCache cache1 = SomeCache.getCache();
SomeCache cache2 = SomeCache.getCache();
System.out.println(cache1 == cache2);
}
}
3. 반환 타입의 하위 타입 객체를 반환 할 수 있는 능력이 있다.
이는 API를 만들때 유연성을 구현하면 구현체 클래스를 노출하지않고 그 객체를 쉽게 반환 할 수 있다..
4. 어떤 매개변수가 들어오는지에 따라 다른 클래스의 객체를 반환할 수 있다.
이는 반환타입의 하위클래스면 어떤 클래스를 반환해줘도 문제가 없다는 것이다.
인터페이스 또는 부모 클래스를 정적 팩터리 메서드 반환 타입으로 주고 호출시 구분 값을 넘겨주면 조건에 따라 반환할 객체를 선택 가능하게 구현 할 수 있다.
public class UserFactory {
public static User getUser(String type) {
if(type.equals("1")) {
return new SomeTypeUser();
}
else {
return new SomeType2User();
}
}
}
단점
1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
정적 팩터리 메서드만 제공하는 클래스는 대부분 private 생성자를 만들어 해당 클래스를 인스턴스로 만들 수 없게해 상속이 필요한 시점에서는 문제가 될 수있다. 대표적인 예로는 Collections 클래스가 있다.
2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
생성자는 API문서 상단에 설명에 명확히 드러나지 않으니 사용자는 정적 팩터리 메서드 방식 클래스를 인스턴스화할 방법을 알아야하는 문제점이 있어 자주 사용하는 네이밍 컨벤션이 존재한다.
정적 팩터리 메서드 네이밍 컨벤션
from: 매개 변수 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드로 사용한다.
of: 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메서드 이다.
getInstance | Instance: 매개 변수를 받는다면 매개 변수로 명시한 인스턴스를 반환하고 없다면 대부분 미리 생성된 인스턴스를 반환하는데 사용한다.
createInstance | create: 매번 새로운 인스턴스를 생성하여 반환한다.
'book review > Effective java' 카테고리의 다른 글
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2024.02.06 |
---|---|
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2024.02.05 |
[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.02.02 |
[Effective Java] Item 3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (1) | 2024.02.01 |
[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.01.31 |