이펙티브 자바 공부 - 정적 팩토리 메소드 패턴
소소하게 하나씩 공부해 나가려고 한다. 영문을 번역하는 겸으로 직접 적어나가면서 공부할 예정.
객체 생성과 소멸
생성자 대신에 정적 팩토리 메소드 패턴을 사용해라!
원래라면 클라이언트가 인스턴스를 얻게 해주는 전통적인 방법은 public 생성자를 주는 것이었다.
But? static한 팩토리 메소드를 만들어서 이를 보완도 가능하다고 해요!
책에 나와있는 예시는 다음과 같다. 이 코드는 원시 자료형 boolean을 Boolean형 Object로 바꿔준다고 한다.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
정적 팩토리 메소드 패턴은 절대 디자인 패턴의 팩토리 메소드 패턴의 그것과 같은 것은 절대 아님! 이번에 기술된 것은 디자인 패턴과 직접적으로 같지 않대요.
이제 우리는 클라이언트에게 생성자를 주는 대신에 정적 팩토리 메소드를 주게하거나, 아니면 둘다 주는 방법으로 사용하게 할 수 있다고 한대요. 이제 public 생성자 대신에 정적 팩토리 메소드를 제공하는 것은 장점과 단점을 다 갖고 있대요
장점
1. 정적 팩토리 메소는 생성자와는 다르게 이름이 있다는 것!
만약 어떤 클래스가 여러개의 생성자를 갖고있으면 어떻게 될까?
public class Foo {
private int x;
private char y;
public Foo(int num) {
x = num;
}
public Foo(char character) {
y = y;
}
}
지금은 생성자가 두개밖에 없어서 그냥 딱 보고 넣을 수 있겠죠..?
public class Main {
public static void main(String[] args) {
Foo foo = new Foo(1);
Foo bar = new Foo('a');
}
}
생성자가 너무 많아지게 되면 어떻게 될까? 파라미터가 너무 많으면?, 아마도 매번매번 도큐멘트를 읽어야 하지 않을까? 그런데 만약 정적 팩토리 메소드의 장점이 나온답니다.
public class Foo {
public static Foo newInteger(int num) { return new Foo(num); } // 정적 팩토리 메소드
public static Foo newCharacter(char character) { return new Foo(character); } // 정적 팩토리 메소드
private int x;
private char y;
private Foo(int num) {
x = num;
}
private Foo(char character) {
y = character;
}
}
그렇다면 각각의 생성자에 이름을 붙이게 하면서도 쓸수 있겠죠?
public class Main {
public static void main(String[] args) {
Foo foo = Foo.newInteger(1);
Foo bar = Foo.newCharacter('a');
}
}
이렇게 하면 각각의 생성자들에게 이름을 부여할수 있게 되서 개발자가 훨씬 개발하기에 눈에 잘 들어올거에요!
2. 정적 팩토리 메소드는 생성자와는 다르게 호출될때 마다 오브젝트를 무조건 생성할 필요는 없다!
정적 패토리 메소드는 불변 클래스들이 사전에 생성된 인스턴스나, 만들어져있던 캐시 인스턴스들을 사용할 수 있게 해주고 불필요하게 중복되는 객체를 만드는걸 막아준대요! 대표적인 예로는 Singleton 패턴같은것도 비슷한 원리로 쓰는것 같네요
방금전에 예시로 제시했던 Boolean.valueOf(boolean) 메소드가 또다른 대표적인 예시가 될수 있답니다. 이 메소드는 객체를 안 만든대요! 이 방법은 FlyWeight Pattern과 유사하답니다.
3. 정적 메소리 메소드는 생성자와는 다르게 어떤 하위 자료형도 반환할 수 있다!
즉 반환되는 객체의 클래스를 유연하게 조절할 수 있다는 말이네요! 인터페이스 기반 프레임 워크에도 적합하대요!
… 이건 뭔소리지…
자바 8 이전에는 인터페이스들은 정적 메소들을 가질 수 없었대요. 보통 Type이라 불리는 인터페이스를 위한 정적 팩토리 메소드들은