[Effective Java 3rd] 아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라.

Mr.Sir·2022년 5월 28일
0

Effective Java 스터디

장점
이름을 가질 수 있다.
생성자로만 봤을때 상황에 따라 반환될 객체 특성을 알기 어려움.
호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
불변 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용. (flyweight pattern)
인스턴스 통제 : 반복되는 요청에 같은 객체를 반환하여 언제,어느 인스턴스를 살아있게 할지 통제.
인스턴스를 통제하면 클래스를 싱글턴으로 만들 수도, 인스턴스화 불가로 만들 수 있다.

또한 불변 값 클래스에서 동치인 인스턴스가 단 하나뿐임을 보장할 수 있다.
반환 타입의 하위 타입 객체를 반환할 수 있다.
반환할 객체의 클래스를 자유롭게 선택가능한 유연성 확보.
입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
반환 타입의 하위 타입이기만 하면 어떤 클래스의 객체도 반환 가능.
정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. 서비스 제공자 프레임워크 : 구현체의 동작을 정의하는 서비스 인터페이스, 제공자가 구현체를 등록할 때 사용하는 제공자 등록 API, 클라이언트가 서비스의 인스턴스를 얻을 때 사용하는 서비스 접근 API 클라이언트는 서비스 접근 API를 사용할 때 원하는 구현체의 조건을 명시, 명시하지 않으면 기본 구현체를 반환하거나 지원하는 구현체들을 하나씩 돌아가며 반환! 4번째 컴포넌트인 서비스 제공자 인터페이스 : 인터페이스의 인스턴스를 생성하는 팩터리 객체를 설명 브리지 패턴 같은 여러 변형이 있음. 단점 상속을 하려면 public이나 protected생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다. 프로그래머가 찾기 어렵다. 생성자처럼 API설명에 명확히 드러나지 않아 사용자는 정적 팩터리 메서드 방식 클래스르 인스턴스화할 방법을 알아내야 한다. 일반적인 명명방식 : from, of, valueOf, instance(getInstance), create(newInstance), getType, newType, type

*장/단점이 있다 하더라도 정적 팩터리를 사용하는 게 유리한 경우가 많으므로 public생성자 습관 고칠필요.

아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라. 클래스용 생성자에 매개변수가 많을 경우 일반적으로 점층적 생성자 패턴 사용(계속적인 추가)이나 자바빈즈 패턴(매개변수 없는 생성자로 객체 생성 후 setter메서드들을 호출하여 매개변수값 설정) 사용. 위의 두가지를 보완할 수 있는 것이 빌더. 필수 매개변수만으로 생성자 혹은 정적 팩터리를 호출하여 빌더 객체를 얻는다. 그런 다음 빌더 객체가 제공하는 일종의 세터 메서드들로 원하는 선택 매개변수들을 설정한다. 마지막으로 매개변수가 없는 build 메서드를 호출해 우리에게 필요한 (불변)객체를 얻는다. 형변환을 쓰지 않는 자유로움, 빌더에 넘기는 매개변수에 따라 다른 객체를 만들 수 있음,

*매개변수가 4개 이상은 되어야 값어치를 함. 보통 시간이 지날수록 매개변수가 늘어나므로 처음부터 고려하여 작성하는것이 좋음. (점층적)생성자 - 정적 팩터리 메서드 - “빌더 패턴"

*참고 https://github.com/keesun/study/tree/master/effective-java

profile
Deepveloper

0개의 댓글