2016-07-17 11 views
5

LocalDate, LocalTime, Stream 등의 개체는 생성자 대신 공장 메서드 을 사용합니까?LocalDate, LocalTime 및 Stream 객체가 생성자 대신에()의 팩토리 메소드를 사용하는 이유는 무엇입니까?

newhere 대신 공장 방법을 사용해야하는 이유에 대한 설명을 발견했습니다. 이 대답은 여러 가지 이유를 제공하지만, 자바 날짜/시간 API 관련이있는 유일한 것은 다음과 같다 : 생성자와 달리

, 그들은 새로운 객체에게 자신을 호출하고 각 시간을 만들 필요가 없습니다를

LocalDate으로

LocalTime는 불변, 아마 공장을 사용하여 새 개체마다 시간을 만드는 기존 개체를 재사용 할 수 있습니다.

LocalDateLocalTime과 같은 객체가 팩토리 메소드 (즉, LocalDate.of())로 생성되는 이유는 무엇입니까? 다른 이유가 있습니까?

또한 Stream 개체는 변경할 수 있습니다. 공장 방법 (Stream.of())을 사용하여 Stream을 만드는 이유는 무엇입니까?

+1

[프로그래머 관련이 질문에 대한 답변] (http://programmers.stackexchange.com/q/322936/187318)도 흥미로울 수 있습니다. – Hulk

답변

10

왜 스트림을 만드는 데 팩토리 메서드 (Stream.of())가 사용됩니까?

팩토리 방식을 사용한다는 것은 사용 된 정확한 클래스를 알 필요가 없음을 의미합니다. 이것은 좋은 예이며 Stream은 인터페이스이며 인터페이스 인스턴스를 만들 수 없습니다. Stream.of

/** 
* Returns a sequential {@code Stream} containing a single element. 
* 
* @param t the single element 
* @param <T> the type of stream elements 
* @return a singleton sequential stream 
*/ 
public static<T> Stream<T> of(T t) { 
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false); 
} 

/** 
* Returns a sequential ordered stream whose elements are the specified values. 
* 
* @param <T> the type of stream elements 
* @param values the elements of the new stream 
* @return the new stream 
*/ 
@SafeVarargs 
@SuppressWarnings("varargs") // Creating a stream from an array is safe 
public static<T> Stream<T> of(T... values) { 
    return Arrays.stream(values); 
} 

참고 소스에서

:이 방법은 다른 팩토리 메소드를 호출합니다.

호출 방법에 따라 다른 구성을 볼 수 있습니다. 당신은 이것을 알 필요가 없으며 궁극적으로 생성 된 클래스는 ReferencePipeline.Head

+1

감사! 나는이 대답을 가장 위로 받았다. 그러나 Andy Turner의 대답은 나의 질문의 두 번째 부분에 대한 답이다. – Alex

7

+1 피터의 대답에 +1 할 수 있습니다.

팩토리 메서드를 사용하는 또 다른 이유는 "명명 된 생성자"처럼 작동한다는 것입니다.예를 들어

, LocalDate는 (적어도 여기 완전하지 않을 수) 6 개 정적 공장 메소드가

  • of(int year, int/Month month, int dayOfMonth) (두 과부하)
  • ofEpochDay(long epochDay)
  • ofYearDay(int year, int dayOfYear)
  • parse(CharSequence text)
  • parse(CharSequence text, DateTimeFormatter formatter)

매우 유사한 매개 변수 유형을 가진 많은 구성자가 아니라 개별적으로 명명 된 메서드를 사용하여 다양한 매개 변수의 의미를 이해하는 것이 훨씬 더 명확하다고 생각합니다. 팩터 리 메소드에 대해 매개 변수가 무엇인지 추측 할 수 있습니다. 반면 "익명"생성자 인 경우 실제로 Javadoc (충격 공포)을 읽어야 할 수도 있습니다.

틀림없이 ofYearMonthDayOfMonth을 원할 수도 있습니다. 그러나 이것이 가장 일반적으로 사용되는 공장 방법이라고 생각합니다. 항상 긴 이름을 입력하는 것이 너무 복잡합니다.


이 경우 모든 생성자를 통해 정적 팩토리 메소드를 선호하는 이유와시기에 대한 효과적인 자바 2 판이다의 항목 1, 그것을 읽을 수 없습니다했습니다. 여기서 언급 한 "명명 된 생성자"장점은 실제로 Bloch의 첫 번째 장점입니다.

+0

감사합니다. 이제는 분명합니다. 내 게시물에는 효과적인 Java의 추출/요약 링크가 있습니다. 이 원칙이 Java SE 8 API에 어떻게 적용되었는지는 알 수 없습니다. – Alex

+0

이제 두 가지 대답을하고 각각 내 질문의 절반에 대답합니다. 나는 받아들이는 데 어려움을 겪을 것이다.) – Alex

+2

@Alex Peter는 분명히 1 점 또는 2 점에 미치지 못한다. 가난한 작은 나를 도와 준다.; p 걱정하지 마라. 나는 우리 모두에게 화를 낼 것이다. 당신은 다른 것을 선택합니다. –