Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

개발자일기

생성자 대신 정적 팩토리 메소드를 고려하자 본문

개발

생성자 대신 정적 팩토리 메소드를 고려하자

ka0oll 2020. 5. 22. 23:08

생성자 대신 정적 팩토리 메소드 사용

클래스의 생성자와 별도로 객체를 생성하는 팩토리 메소드를 제공할수있다.

팩토리 메소드를 지향하는 이유는 다음과 같다.

 

이름을 가질수 있다.

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();

 

 

Comments