Item1. 생성자 대신에 정적 팩토리 메소드를 구현하라
2021-07-15 21:51:06
#Java#Effective Java 3/E
- 정적 팩토리 메소드(static factory method)란 ? 클래스의 instance를 반환해주는 메소드
- 클래스의 인스턴스를 얻는 전통적인 방식은 public constructor
- 생성자 방식보다는 정적 팩토리 메소드를 사용하여 instance를 만들면 다음과 같은 장단점이 있다.
장점
- 이름을 가질 수 있다. 생성자 방식은 별도로 이름을 지정할 수 없다. 하지만 정적 팩토리 메소드 방식은 직관적으로 naming을 하여, 코드 가독성이 증가한다.
// 생성자 방식
BigInteger(int param, Random random){
// return random prime
}
// static factory method 방식
BigInteger.createRandomPrime(){
//return random prime
}
- 호출될때마다 인스턴스를 새로 생성하지는 않아도 된다. static method이기 때문에 인스턴스를 new 해서 생성하지 않고 클래스로 바로 호출 가능하다.
- 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 즉, 반환할 객체의 클래스를 선택할 수 있는 유연성이 있다.
- 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
- 정적 팩토리 method를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
단점
-
상속을 하려면 public, protected 생성자를 제공해야 한다. 즉, 정적 팩터리 메소드만 제공하면 하위 클래스를 만들 수 없다.
-
정적 팩토리 메소드는 프로그래머가 찾기 어렵다. 생성자처럼 API 설명에 명확히 드러나지 않으므로, 사용자는 정적 팩토리 메소드 방식 클래스를 인스턴스화할 방법을 알아내야 한다. 따라서 API 문서를 잘 작성하고, 널리 알려진 규약을 따라 메소드 이름을 짓는 것이 좋다.
정적 팩토리 메소드 네이밍 컨벤션
from: 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메소드Date d = Date.from(instant);of: 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메소드Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);valueOf: from과 of의 더 자세한 버전BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);instance/getInstance: 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지 않음create/newInstance: 매번 새로운 인스턴스를 생성해 반환함을 보장getType: getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩토리 메소드를 정의할 때 사용FileStore fs = Files.getFileStore(path);newType: newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩토리 메소드를 정의할 때 사용type: getType과 newType의 간결한 버전
