2016-07-17 19 views
5

なぜLocalDate,LocalTimeStreamなどのオブジェクトは、コンストラクタの代わりにファクトリメソッドof()を使用しますか?LocalDate、LocalTime、Streamオブジェクトがコンストラクタの代わりに()のファクトリメソッドを使用する理由

newhereの代わりにファクトリメソッドを使用する理由を説明しました。この答えは、多くの理由を与えますが、Javaの日付/時刻のAPIに関連する唯一のものは以下の通りです:コンストラクタとは異なり

、彼らは新しいオブジェクトに彼らが呼び出されている各 時間を作成する必要はありませんがLocalDateLocalTimeとして

は不変である、それはおそらく、工場を使用して、代わりに新しいオブジェクトを毎回作成する既存のオブジェクトを再利用することは理にかなって。

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の答えは私の質問の第2部分に答えています。 – Alex

7

+1ピーターの答えです。

ファクトリメソッドを使用するもう一つの理由は、それらが「名前付きコンストラクタ」のように動作することです。例えば

LocalDateは、(少なくとも、私はここで網羅的ではないかもしれない)6つのstaticファクトリメソッドがあります。

  • of(int year, int/Month month, int dayOfMonth)(2つのオーバーロード)
  • ofEpochDay(long epochDay)
  • ofYearDay(int year, int dayOfYear)
  • parse(CharSequence text)
  • parse(CharSequence text, DateTimeFormatter formatter)

非常に似たパラメータタイプを持つコンストラクタの束ではなく、これらを個別に名前付きのメソッドにすることで、さまざまなパラメータの意味を理解することがはっきりしていると思います。ファクトリメソッドのパラメータはどういうものかをかなり推測することができますが、 "名前のない"コンストラクタの場合はJavadoc(ショックホラー)を実際に読む必要があります。

確かにofYearMonthDayOfMonthがほしいと思うかもしれませんが、私はこれが最も一般的に使われているファクトリーメソッドだと思っています。あなたはそれを読んでいませんでした場合は


の項目1効果的なJavaの第2版は、すべての理由とするとき、コンストラクタオーバーstaticファクトリメソッドを好むしようとしています。私がここで言及した「名前付きコンストラクタ」の利点は、実際にはBlochが強調する最初の利点です。

+0

ありがとう!今それは明らかです。私の投稿には、有効なJavaの抽出/要約へのリンクが含まれています。私はこれらの原則がJava SE 8 APIにどのように適用されているか分かりませんでした。 – Alex

+0

今私は2つの答えがあり、それぞれが私の質問の半分に答えます。私は受け入れることを選ぶのに苦労するだろう) – Alex

+2

@Alex Peterは明らかに1点か2点に足りない、貧しい私を助けてくれる...; p心配しないで、あなたはもう一方を選ぶ。 –

関連する問題