정적 펙토리 메소드 -???? 이게 뭘까 아직 까진 정확히 감이 안잡힘.
그런데 1~3장에 걸쳐서 계속해서 설명중... 궁금함
--> 객체 생성의 역할을 하는 클래스 메서드라는 의미로 요약해볼 수 있다.
이렇다곤 하는데...여전히 감은 안잡힘
아 생성자를 통한 객체 생성이 아닌 메소드를 통한 객체생성
납득 납득
일단 정리 하기에 앞서 필자는 ㅋㅋㅋ 이팩티브 자바를 3~5장 까지 읽을때까지 그래서 정적펙토리 메소드가 뭔데?? 디패에서 팩토리 메소드랑 뭐가 다른거지??? 이러고 있었음...
그래서 오늘 최소한의 목표였던 5장까지 읽기 전에 3장쯤에서 검색을 해보고 나서 이해함ㅋㅋㅋㅋㅋ
팩토리 메소드 : 객체 생성 역할을 하는 클래스 메소드
라는 걸 딱 한줄 요약을 하고 나니 이제야 이해를 했다...ㅋㅋㅋㅋㅋ
각설하고 정리를 하면
생성자만으로는 객체의 특성을 명확히 나타내기 어려운 경우가 많은 반면,
정적 팩토리 메소드는 객체의 특성을 명확하게 표현할 수 있다.
ex) BigInteger.probablePrime = 값이 소수인 BigInteger를 반환하다.
이런식으로 표현이 가능하기 때문이다.
1개의 생성자는 1개의 시그니처 밖에 가질 수 밖에 없는데 반면,
여러개의 정적팩토리 메소드는 1개의 시그니처를 가질 수 있다. 대신 여기서 주의 할 점은 같은 시그니처이기 때문에 서로가 구분이 가지 않을 수 있으므로 차이를 표현할 수 있게 이름을 잘 지어야한다.
정적 팩토리 메소드의 경우 인스턴스(객체)를 미리 생만들어 두거나, 새로 생성한 인스턴스를 캐싱하여 재활용하여 불필요한 객체 생성을 막을 수 있다.
ex) Boolean.valueOf(boolean) = 객체를 아예 생성하지 않음
이는 객체가 언제 살아 있는지 통제가 가능하다. 이런 클래스를 instance -controlled 클래스라 한다.
Q. 그럼 왜 통제를 하는 걸까??*
A-1. 클래스를 싱글톤으로 만들 수 있기 때문입니다.
A-2. 인스턴스 불가로 만들 수 있기 때문입니다.(noninstantiable)
A-3. 불변 값 클래스에서 동일한 인스턴스는 1개임을 보장이 가능 하다.
아직 플라이웨이트 패턴이 뭔지는 모름...
이는 API를 만들때 유연한건데 구현 클래스를 공개하지 않고도 객체를 반환하는게 가능하다! == API를 작게 유지 가능!
나중에 보면 이해하지 못할거기 때문에.. 자세히 적으면..
자바 컬렉션 프레임워크는 핵심 인터페이스들에 수정 불가, 동기화 등등의 기능을 붙인 45개의 유틸리티 구현체를 제공한다. 이 대부분의 구현체들은 단 1개의 인스턴스 불가 클래스인java.util.Collections에서 정적 팩토리 메소드를 통해서 사용(?) 얻도록(?)하였다.
*컬렉션을 사용하고 싶을때(?) 접근 하고 싶을때(?) 객체 생성이 불가능한 java.util.Collections를 사용하여 접근한다는 건가??
반환 되는 게 하위 타입이라면 어떤 클래스의 객체던 반환 할 수 있다.
A라는 클래스가 상위 클래스고, B,C,D가 하위 클래스라면 A는 B,C,D중 어느것이나 반환이 가능하다.
이런건 서비스 제공자 프레임워크를 만드는데 근간이다. -> 이게 뭐지?
대표적인 예론 JDBC가 있는데 위의 정의중 제공자의 의미ㅈ는 서비스의 구현체라는 것이다. 그리고 프레임워크가 클라이언트에게 제공하기 위해서 구현체들을 통제함과 동시에 사용자로부터 분리한다.
뭔가 MVC&MTV 패턴이 생각나는 거 같은건 기분탓인가?? 좀더 공부가 필요할 듯
위의 정의는 총 3가지의 핵심 컴포넌트로 이뤄지는데.
이렇게 총 3가지로, 1번은 구현체의 동작을 정의하고, 2번은 제공자가 구현체를 등록하고, 3번은 클라이언트가 서비스의 인스턴스를 얻을 때 사용한다.
3번이 바로 이것들중 가장 핵심이라 할 수 있는 유연한 정적 팩터리이다. 그리고 이건 널리 알려진 브리지 패턴이다.
이는 만약 불변타입으로 만들고, 컴포지션으로 사용하는 경우는 장점이다.
아직 안나온 내용이라 잘 이해가 안간다...
잘 나오지 않으니...API 문서를 잘 작성하두고, 이름도 규약에 맞게 작성해야한다..