Dev/JAVA

[Effective JAVA] 생성자 대신 정적 팩터리 메서드를 고려하라. ( 아이템 1 )

록흐 2024. 3. 20. 21:58
반응형

 

 

클라이언트가 특정 클래스의 인스턴스를 얻으려면 new 연산자로 public 생성자를 호출하면 된다.  

하지만 이는 많은 단점을 가지고 있다. 

 

1) 생성자는 오버로딩되어 파라미터에 따라 다양한 형태가 존재하는데, 생성자는 모두 동일한 이름이라 어떤 생성자가 어떤 종류의 인스턴스를 생성하는지 알 수 없다. 

2) new 연산을 할 때마다 객체가 하나씩 생성되므로, 호출이 잦은 객체인 경우 쓸데없이 많은 객체가 생성될 수 있다. 

3) 자기 자신의 인스턴스만 생성 가능하다. 

4) 클라이언트와 생성하려는 클래스의 생성자를 참조하가 위해 클래스를 import 해야하므로 결합도가 올라간다. 

 

이는 정적 팩터리 메서드로 해결 가능하다. 

 

1) 생성자는 오버로딩되어 파라미터에 따라 다양한 형태가 존재하는데, 생성자는 모두 동일한 이름이라 어떤 생성자가 어떤 종류의 인스턴스를 생성하는지 알 수 없다.

-> 메소드명으로 원하는 인스턴스의 종류를 명시하면 된다. 

 

2) new 연산을 할 때마다 객체가 하나씩 생성되므로, 호출이 잦은 객체인 경우 쓸데없이 많은 객체가 생성될 수 있다. 

-> 불변객체를 만들어 return하면 해결 된다. 

 

3) 자기 자신의 인스턴스만 생성 가능하다. 

-> Return 타입은 하위객체도 가능하므로, 자신의 자식 객체도 유연하게 반환할 수 있다. 

 

4) 클라이언트와 생성하려는 클래스의 생성자를 참조하가 위해 클래스를 import 해야하므로 결합도가 올라간다. 

-> Return 타입을 인터페이스로 지정하면, 클라이언트는 굳이 특정한 구현체 클래스를 import하지 않아 결합도가 떨어진다. 

 

 

정적 팩터리 메서드의 단점

 

1) 상속이 불가능하다. 

public, protected 정도의 접근제어자가 선언된 생성자가 필요하다. 

 

2) 정적(static)이므로 인스턴스가 존재하지 않으므로, 개발자가 찾기 힘들다. 문서화를 잘해야 한다. 

반응형