2017-12-13 5 views
1

효과적인 자바를 읽었으며 작성된 정적 팩토리 메서드의 장점 중 하나는 반환 유형의 하위 유형의 객체를 반환 할 수 있다는 것입니다. 다음 링크에서 예를 들어 설명했듯이이를 구현할 수있는 방법을 이해했습니다. https://www.slideshare.net/mysky14/java-static-factory-methods정적 팩터 리 방법 장점

그러나 컬렉션 API의 예 Collections의 유틸리티 클래스의 static 팩토리 메소드를 가지고 있으며,이 컬렉션 API는 32을 수출했다되었을 것보다 훨씬 작다 "고 기록됩니다 주어진 책에 별도의 공개 수업 ".

이러한 방식으로 API는 클래스가없는 객체를 공개 할 수 있으며 이는 매우 컴팩트 한 API를 생성한다는 것을 언급했습니다.

이 메서드를 구현하고 별도의 공용 클래스가 없어도 API 크기가 어떻게 감소되는지 알고 싶습니다.

+1

읽었습니까? https://stackoverflow.com/questions/13046877/consider-providing-static-factory-methods-insteads-of-constructors? – vinS

+1

API는이 문맥에서 "사용자가 볼 수있는 크기"를 의미합니다. 그래서 32 개의 클래스가 존재하지만, 사용자로서, 당신은 그것들에 대해 알 필요가 없다. 그것들이 Lists 또는 Sets임을 알면 충분하다. –

답변

0

이 메서드를 구현하면 API 크기가 어떻게 감소되는지 알고 싶습니다. 별도의 공개 수업이 있습니다.

은의이 책에 사용 된 것과 같은 구체적인 예를 사용하자 : RegularEnumSet 또는 JumboEnumSet : java.util.EnumSet은 두 가지 구현 중 하나를 반환 정적 공장을 가지고있다. 이러한 구현은 고유 한 복잡성을 가지고 있지만 컬렉션의 클라이언트에게는 효과적으로 숨겨져 있습니다. 이론적으로, 공장은 미래에 다른 구현을 사용할 수 있으며, 클라이언트는 영향을받지 않습니다. 당신이 클래스 다이어그램에서이 가시화 경우

, 팩토리 메소드 (예를 들어, of()는 생성자와 반대) 구현의 세부 사항을 숨기는 추상적 유형 EnumSet을 반환합니다. 추상 (또는 인터페이스) 유형은 API를 효과적으로 추상화 (단순화)합니다.

무엇보다

enter image description here

는 구현은 public 키워드없이이 선언되고있는 의미, 실제로패키지 개인 있습니다. 즉, 동일한 패키지에있는 클래스 만 해당 패키지를 볼 수 있으므로 Client이 의존합니다. 이것은 정보 숨기기의 좋은 예이며, API 개발자는 API를 단순화하고 코드를 위반하지 않고 숨겨진 부품을 나중에 변경할 수 있습니다.

팩토리 메소드가 API를 단순화 할 수있는 또 다른 예는 컬렉션의 구체적인 반복자입니다. 이 경우 정적이 아닌 팩터 리 메서드입니다 (예 : ArrayList.iterator()). ArrayLists에 대한 구체적인 반복자를 반환합니다. 이 클래스의 이름은 EnumSet 구현보다 덜 알려져 있습니다.

0

일반적으로 정적 팩터 리 메소드를 사용하면 객체 인스턴스화 논리가 클래스에서 제거됩니다. 특정 논리를 기반으로 다른 하위 클래스 객체를 반환해야한다고 가정합니다. 이렇게하면 클래스 메소드의 if-else 논리가 적절한 객체 인스턴스화를 담당합니다. 이를 정적 팩터 리 메서드로 이동하면 테스트하기가 쉬우 며 "닫힘 - 수정"원칙에 가깝게됩니다.