Item 1. constructor 대신 static factory method를 사용할 수 없는지 생각하라.

2019. 3. 7. 11:26Java/Effective Java

반응형

Class로부터 object를 만드는 2가지 방법.

 ① public constructor

 ② public static factory method




 우리는 보통 public 생성자를 통해 객체를 생성한다.

 이 때, 이 객체 생성을 static factory method를 이용하여 생성할 수는 없는지 아래의 장단점을 체크해보고 고려해보도록 하자.


장점

1. 생성자와 달리 메서드이기에 이름을 가질 수 있다. 따라서 가독성이 높다.

 메서드에는 우리가 이름을 지을 수 있다. 따라서 기능에 대해서 우리가 이름을 지어줄 수  있기에 가독성이 높다.

 그리고 동일한 시그니쳐(= 동일한 매개변수들)를 이용해야 할 때, 만약 생성자로 만든다면 어떤 생성자가 어떤 기능을 하는지 헷깔릴 수가 있다.

 public Car(String s, int i) { }

 public Car(int i, String s) { }

>> 위의 생성자의 용도를 쉽게 알아볼 수가 없다.


2. 호출할 때마다 새로운 객체를 생성할 필요가 없다.

 즉, 동일한 객체 요청이 잦고, 객체 생성 비용이 높을 경우에 정적 팩토리 메서드를 이용한다면 성능을 향상 시킬 수 있다.


 동일한 객체를 반복해서 반환할 수 있는 instance-controlled class(개체 통제 클래스) 라고 할 수 있는데.

 이 개체 통제 클래스는 

 1) Singleton pattern 을 따르도록 할 수 있고

 2) 객체 생성이 불가능한 클래스로 설정할 수 있고, ( costructor를 private화)

 3) ==을 통해 equals 연산을 가능하도록 설정하여 성능을 향상시킬 수 있다.


3. 생성자와 달리 하위 자료형 객체를 반환 할 수 있다.

 반환 객체가 유연하다. 

 이런 성질을 이용하면 구현사항을 private하여 숨기면서 이 정적팩토리메서드로 반환은 가능하게 만들 수 있는거다.


4. 형인자 자료형(parameterized type) 객체 만들 때 편하다.


단점

1. 생성자 없이 정적 팩토리 메서드만 가지고 있는 클래스의 경우, 

 public, protected로 선언된 생성자가 없기 때문에 하위 클래스를 만들 수가 없다. 


2. 기본 정적 메서드와 정적 팩토리 메서드를 구분할 수 없다.

> 주석이나, 메서드 naming 을 통해 알아볼 수 밖에 없다.



>> 그래서, 정적 팩토리 메서드의 이름을 지을 때에는 신경을 써서 지어줘야 한다.

보통 API에서 사용되고 있는 정적 팩토리 메서드 이름들은 아래와 같다.

: valueOf, of, getInstance, newInstance, getType, newType



 정적 팩토리 메서드와 생성자는 각각 용도가 다르고,

 또, 장단점과 차이점이 존재하다.

 그러나 보통은 정적 팩토리 메서드를 사용하는 것이 더 효과적인 경우가 많다. 

 그러니, 무조건 public생성자를 이용하여 객체를 생성하지 말고 정적 팩토리 메서드로 대체가 가능한지 고려해보자.



728x90
반응형