아마 BigInteger를 돌려주는 BigInteger (int, int, Random)
프라임은 BigInteger.probablePrime이라는 정적 팩토리 메소드로 더 잘 표현되었을 것입니다.
(이 방법은 결국 1.4 릴리스에서 추가되었습니다.)
클래스는 주어진 서명을 가진 생성자를 하나만 가질 수 있습니다. 프로그래머
두 개의 생성자를 제공하여이 제한을 해결하는 것으로 알려져 있습니다.
그의 매개 변수 목록은 매개 변수 유형의 순서 만 다릅니다. 이것은
정말 나쁜 생각이야. 그런 API의 사용자는 어떤 API를 기억하지 못할 것입니다.
생성자는 실수로 잘못된 것을 호출하게 될 것입니다. 사람들
이러한 생성자를 사용하는 코드를 읽는 것은 코드가 코드없이 무엇을하는지 알 수 없습니다.
클래스 문서를 참조하십시오.
이름이 있기 때문에 정적 팩토리 메서드는 제한을 공유하지 않습니다.
이전 단락에서 논의했다. 수업이 여러 번 요구되는 경우
같은 서명을 가지는 생성자를 static 팩토리로 옮겨 놓는다
방법 및 신중하게 선택한 이름을 사용하여 차이점을 강조하십시오.
정적 팩토리 메소드의 두 번째 이점은 생성자와 달리,
호출 될 때마다 새로운 객체를 생성 할 필요가 없습니다. 이
불변 클래스 (항목 15)가 사전 생성 된 인스턴스를 사용하거나 캐시 할 수있게합니다.
생성 된 인스턴스를 반복적으로 분배하여 생성하지 않도록합니다.
불필요한 중복 객체. Boolean.valueOf (boolean) 메소드는 다음을 보여줍니다.
이 기술은 결코 객체를 생성하지 않습니다. 이 기술은
플라이급 패턴 [감마 95, p. 195]. 다음과 같은 경우 성능을 크게 향상시킬 수 있습니다.
동등한 객체가 자주 요청됩니다. 특히 비용이 많이 드는 객체 인 경우 더욱 그렇습니다.
정적 인 팩토리 메소드가 같은 객체를 반복 해 돌려주는 기능
호출은 클래스가 어떤 인스턴스가 존재하는지에 대한 엄격한 제어를 유지하도록합니다.
언제든지. 이를 수행하는 클래스는 인스턴스 제어라고합니다. 여러 가지가있다.
인스턴스 제어 클래스를 작성해야하는 이유. 인스턴스 컨트롤을 사용하면 클래스가
그것은 싱글 톤 (항목 3) 또는 인스턴스화 불가능 (항목 4)을 보장합니다. 또한,
두 개의 동일한 인스턴스가 없다는 것을 보장하는 불변 클래스 (항목 15)
존재하는 경우 : a.equals (b) a == b 인 경우에만 b. 클래스가이 보증을하면 클라이언트
equals (Object) 메서드 대신 == 연산자를 사용할 수 있습니다.
결과적으로 성능이 향상됩니다. 열거 유형 (항목 30)은이 보증을 제공합니다.
정적 팩토리 메소드의 세 번째 이점은 생성자와 달리,
리턴 유형의 부속 유형의 오브젝트를 리턴 할 수 있습니다. 이것은 당신에게 준다.
반환 된 객체의 클래스를 선택할 때 큰 유연성을 제공합니다.
이 유연성의 한 응용 프로그램은 API가
수업을 공개합니다. 이 방식으로 구현 클래스를 숨기는 것은
아주 조밀 한 API. 이 기술은 인터페이스 기반 프레임 워크에 적합합니다.
(항목 18). 인터페이스는 정적 팩토리 메소드에 자연스러운 리턴 유형을 제공합니다.
인터페이스에는 정적 메서드가있을 수 없으므로 관습에 따라 다음과 같은 정적 팩터 리 메서드가 필요합니다.
Type이라는 이름의 인터페이스는 Types라는 이름의 인스턴스가 아닌 클래스 (항목 4)에 놓입니다.
예를 들어, Java Collections Framework에는 32 편의 편의성이 있습니다.
컬렉션 인터페이스의 구현, 수정 불가능한 콜렉션 제공,
동기화 된 콜렉션 등을 포함한다. 거의 모든 구현은
하나의 인스턴스가 아닌 클래스 (java.util.Collections)에서 정적 팩토리 메서드를 통해 내 보냅니다.
반환 된 객체의 클래스는 모두 비공개입니다.
Collections Framework API는 이전보다 훨씬 작습니다.
각 편의 구현마다 하나씩 32 개의 개별 공개 클래스를 수출했습니다.
축소 된 API의 대부분은 아니지만 개념적
무게. 사용자는 반환 된 객체가
그것의 공용 영역, 그래서 추가 종류 문서를 읽을 필요가 없습니다
구현 클래스. 또한, 이러한 정적 팩토리 메소드를 사용하려면
구현이 아니고 인터페이스에 의해 반환 된 객체를 참조하는 클라이언트
일반적으로 우수 사례 (항목 52)입니다.
public static factory 메소드에 의해 반환 된 객체의 클래스뿐만 아니라
비공개이지만 클래스는 호출에 따라 호출마다 다를 수 있습니다.
static 팩토리에 대한 파라미터의 값 클래스의 하위 유형 인 모든 클래스
선언 된 반환 유형은 허용됩니다. 반환되는 객체의 클래스도 달라질 수 있습니다.
향상된 소프트웨어 유지 보수성 및 성능을위한 릴리스 간.
릴리스 1.5에 도입 된 클래스 java.util.EnumSet (Item 32)에는
public 생성자, 정적 팩토리 만. 그들은 두 가지 구현 중 하나를 리턴하는데,
기본 열거 형의 크기에 따라 다릅니다. 64 개 이하
대부분의 열거 형처럼, 정적 팩토리는 RegularEnumSet
하나의 long으로 뒷받침되는 인스턴스. 열거 형에 65 개 이상이있는 경우
요소의 경우, 팩토리는 JumboEnumSet 인스턴스를 리턴합니다.
이 두 가지 구현 클래스의 존재는 클라이언트에게는 보이지 않습니다. 만약
RegularEnumSet은 작은 enum 유형에 대한 성능 이점을 제공하지 않으므로
부작용없이 향후 릴리스에서 제거 될 수 있습니다. 마찬가지로, 미래
릴리스에서는 유익한 것으로 입증되면 EnumSet의 세 번째 또는 네 번째 구현을 추가 할 수 있습니다.
성능을 위해. 클라이언트는 객체의 클래스를 모르고 또한 신경 쓰지 않습니다.
그들은 공장에서 돌아옵니다. EnumSet의 하위 클래스라는 점만주의해야합니다.
static 팩토리 메소드에 의해 돌려 주어지는 오브젝트의 클래스도 존재할 필요는 없습니다.
그 당시 그 방법을 담고있는 수업이 작성되었습니다. 유연한 정적 공장
메소드는 Java Database와 같은 서비스 제공자 프레임 워크의 기본을 형성합니다.
연결 API (JDBC). 서비스 공급자 프레임 워크는
여러 서비스 공급자가 서비스를 구현하고 시스템이 구현을 수행합니다.
클라이언트가 사용할 수 있도록 구현에서 분리 할 수 있습니다.