일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- Exception
- bytecode
- Rest
- JSON
- mockito
- junit5
- AOP
- Generic
- 서명
- JWT
- Java
- rest api
- IOC
- PSA
- SOA
- jvm
- MSA
- *
- redis
- Transaction
- bounded context
- di
- ddd
- spring
- OOP
- reflection
- Spring Data Redis
- Today
- Total
개발자일기
생성자 대신 정적 팩토리 메소드를 고려하자 본문
생성자 대신 정적 팩토리 메소드 사용
클래스의 생성자와 별도로 객체를 생성하는 팩토리 메소드를 제공할수있다.
팩토리 메소드를 지향하는 이유는 다음과 같다.
이름을 가질수 있다.
BigInteger(int, int, Random) 보단 BigInteger.probablePrime 이 '더욱 값이 소수인 BigInteger'을 생성 반환한다고 표현되어질수 있다.
호출때마다 인스턴스를 항상 생성하지 않아도 된다.
매번 객체를 생성 하지 않고 객체풀을 만들어 전달
Boolean.valueOf(boolean)을 보면 Boolean.TRUE, Boolean.FALSE 같이 풀을 관리
반환타입의 하위 타입 객체를 반환할수 있다.
하위클래스를 공개 하지 않고, 상위클래스의 공개만으로 하위클래스 생성하는 방법이다.
입력한 매개변수에 따라 다른 클래스 객체 반환
위의 내용과 비슷한 내용이다.
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
EnumSet은 매개변수에 따라 다른 하위클래스를 반환한다.
구현시점에 작성한 클래스가 없어도 된다.
class Car {
public static Car newTruck() {
Class<?> truckClz = Class.forName("me.javarouka.vehicle.Truck");
return truckClz.newInstance();
}
public static Car newBus() {
Class<?> busClz = Class.forName("me.javarouka.vehicle.Bus");
return busClz.newInstance();
}
}
위 코드처럼 처음 클래스가 로딩 되지 않아도 동적으로 로딩되면서 객체를 생성할수 있다.
결론 : 객체 생성의 자율성을 향상시켜준다.
보편적인 네이밍 방식
from : 매개 변수를 하나 전달 받아 해당객체 반환
- Date d = Date.from(instant)
of : 여러 매개변수를 받아 적합한 객체 반환
- Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING)
valueOf: enum에서 사용된다. from + of를 혼합한 방식
- Rank.valueOf(name);
newInstance, create : 매번 새로운 객체 반환
- Car.newInstance(),
getInstance : 싱글톤일때 사용
get{Type} : 해당 객체가 아닌 다른클래스 type을 반환, type(반환할 타입)
- FileStore fs = File.getFileStore()
- Car truck = Car.getTruck();
new{Type} : 해당 객체가 아닌 다른클래스 type을 새로 생성 반환, type(반환할 타입)
- BufferedReader reader = Files.newBufferedReader(_,_);
- Car truck = Car.newTruck();
'개발' 카테고리의 다른 글
카프카 개념과 특징 (0) | 2021.01.25 |
---|---|
가변보다 불변객체 (0) | 2020.05.25 |
객체지향 생활 체조 원칙 3: 모든 원시값과 문자열을 포장한다. (0) | 2020.05.22 |
객체 지향 생활 체조 원칙 규칙 8 : 일급 컬렉션 (0) | 2020.05.17 |
DB 트랜잭션과 lock (0) | 2020.05.10 |