일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- method refetence
- ioc컨테이너
- 토비의 스프링
- kotlin ::
- open-session-in-view
- jpa lazy
- jpa no session
- 도커 이미지 빌드
- 스프링 포매터
- 스프링시큐리티
- kotlin 리팩터링
- 스프링부트 도커
- fetch join
- 그래프큐엘
- spring formatter
- Spring
- Atomicity
- IOC
- 자바 필터
- 비기능적 요구사항
- 생성자주입
- 기능적 요구사항
- java predicate
- 소프트웨어의 품격
- 스프링 시큐리티 설정
- 수정자주입
- 스프링
- 동적파라미터
- 스프링di
- 정적팩토리메서드
Archives
- Today
- Total
공부기록
아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라. 본문
반응형
생성자 대신 정적 팩터리 메서드를 고려하라.
클래스의 인스턴스를 얻는 방법은 전통적으로 public생성자. 그 외에도public 생성자 외에도 클래스의 인스턴스를 반환하는 단순한 정적 메서드도 있다.
정적 팩터리 메서드의 장점
1. 이름을 가질 수 있다.
- 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명 못하지만, 정적팩터리메서드는 반환될 객체의 특성을 이름으로 나타낼 수 있다
- BigInteger(int num1, int num2, Random) <- 특성을 알 수 없다.
- BigInteger.probablePrime <- 이름에 특성을 나타낼 수 있다.
- 하나의 시그니쳐 == 하나의 생성자. 하지만 팩터리메서드는 이름을 줌으로써 각각의 차이를 드러내는 이름을 지어줄 수 있다.
2. 호출할 때마다 인스턴스를 새로 생성하지 않아도 된다.
- 생성비용이 큰 객체가 자주 요청되는 상황이라면, 미리 만들어놓은 인스턴스를 재활용함으로써 성능을 끌어올릴 수 있다.
- 플라이웨이트 패턴과 비슷한 기법.
3. 반환 타입의 하위 타입 객체를 반환할 수 있다.
4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
EnumSet
클래스는 public생성자 없이 정적팩터리만 제공.- 원소의 갯수에 따라
RegularEnumSet
/JumboEnumSet
이란EnumSet
클래스의 하위타입을 반환한다.
- 원소의 갯수에 따라
5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
JDBC
를 생각해볼 것.
정적 팩터리 메서드의 단점
1. 상속을 위해선 public 또는 private 생성자가 필요하기 때문에 정적팩터리메서드만 제공하면 하위클래스를 만들 수 없다.
- 어떻게보면 장점이기도하다. 상속보단 포함관계를 사용하도록 유도하기도 하고, 불변 타입을 만드려면 이 제약을 지켜야하기 때문
2. 정적 팩터리메서드는 프로그래머가 찾기 힘들다.
- 생성자는 API 설명에 명확히 드러나있지만, 정적팩터리메서드는 그렇지 않다. 때문에 메서드 이름을 널리 알려진 규약에 따라 작성하는 것이 필요하다
정리.
정적 팩터리 메서드와 public 생성자는 각자 쓰임새가 있으니, 장단을 이해하고 사용하자. 하지만 정적팩터리메서드가 유리한 경우가 많으니, 무작정 public 생성자를 제공하는 습관이 있다면 고치자.
반응형
'JAVA' 카테고리의 다른 글
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라. (0) | 2019.11.26 |
---|---|
아이템3. private생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2019.11.26 |
아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2019.11.26 |
1022 템플릿메서드 (0) | 2019.10.22 |
[JUnit5] gradle에 junit5 끼얹기 (0) | 2019.08.11 |