개발 기록

[이펙티브 자바] 아이템1 본문

JAVA

[이펙티브 자바] 아이템1

수염차 2024. 8. 26. 23:40

- 생성자 대신 정적 팩터리 메서드를 고려하라

 

클래스의 인스턴스를 얻는 기법에는 public 생성자도 있지만 생성자와 별도로 정적 팩터리 메서드도 사용 가능

 

장점

1. 이름을 가질 수 있다.

- 반환될 객체의 특성에 맞게 이름 짓기 가능

- 생성자와 달리 개수 제약 없이 생성 가능

 

2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.

- 같은 객체가 자주 요청되는 상황에서 사용 가능

ex. 생성자로 인스턴스를 미리 만들어 놓고(private), 외부에서 인스턴스 사용시에는 정적 팩터리 메서드를 통하여 가져와 사용. 이렇게 되면 항상 같은 인스턴스를 반환. 인스턴스 통제가 가능해짐.\

 

3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.

- 생성자는 해당하는 클래스의 인스턴스만을 반환. 정적 팩토리 메서드를 사용하면 리턴 타입을 인터페이스나 클래스로 선언해도 인터페이스의 구현체나 하위 클래스 리턴이 가능.

public interface TestService {
	public static TestService of(String no) {
    	if(no.equals("A") {
        	return new AaTestService();
        } else {
        	return new BbTestService();
        }
    }
}

 

 

5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

- 서비스 접근 API (ex.서비스 로더를 사용하여 실제 서비스를 가져옴) 를 사용하면 구현체가 없고 인터페이스만 있어도 정적 팩터리 메서드 작성이 가능.

 

단점

1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.

- 상속하지 않더라도 컴포지션으로 사용 가능 (장점으로 생각할 수 있다.)

2. 정적 팩터리 매서드는 프로그래머가 찾기 어렵다.

- 문서화 어려움

 

* 추가로 찾아보거나 궁금한 것

- 상속이랑 컴포지션 장단점?!

- EnumSet , EnumMap

- 브릿지 패턴 더 자세하게

 

Comments