効果的なJava火曜日!静的工場法を考えましょう


最近、私はジョシュアBloch(アディソンウェズリー2018)によってこれまで人気のEffective Javaを読んでいました.うまくいけば、あなたがJava開発者であるならば、これはあなたがこの本を聞いた初めてでありません.おそらく、あなたは私のようで、あなたがそれを見た最初の時、あなたは考えました実際には、最初のエディションは、2000年初めにリリースされました.しかし、私は私がしようとすると決めた多くの熱烈な勧告を聞いた後にしようとする.言うまでもなく、私は愉快に驚いた.ああ、それは驚くべきことではない、良いデザインは本当にスタイルから出ていない(私たちはまだGang of Fourについて話しますか?)
これのすべてを念頭に、なぜこのシリーズ?正直に、わがままに、1つの理由は、私自身のためです.私は何かを学ぶ最良の方法で固い信者ですそれを教えることです.それでも、私は良いデザインのための愛を持っていると愛を共有し、うまくいけば他の人が新しい何かを学ぶと実践にそれを置くのを助ける.これは、私は本の原則のいくつかを取るし、毎週新しい1つを共有しようとすると決めた.自分自身に低圧を置くしようとしても自分自身にポストするためにケイデンスを与える.
最後に、このシリーズは本の交換ですか?ではなく、私はまだ非常にあなたが本をピックアップ示唆している.うまくいけば、これは本にコンパニオンとして機能することができますし、トピックでは、共有の異なる視点を与える.
それ以上のADOなしで、始めましょう.
第1章:静的工場対建設者
オブジェクト指向プログラミング(OOP)を行うときに最初に学ぶことは、オブジェクトを作成する方法です.あなたがそれらをつくることができなかったならば、それはこれらのすべての物を持っているのに非常に役に立ちません.我々が通常オブジェクトをつくることを学ぶ方法は、建設者によってあります.コンストラクタは非常にシンプルで簡単ですので、これは意味を作り、私たちによく役立つことができます.もう一つのオプションは、著者は、多くのプログラマは、おそらく彼らは静的工場のメソッドである必要がありますに到達しないことを示唆している.では、静的工場の方法は何ですか?単純に静的ファクトリメソッドを入れると、静的メソッドが返され、クラスのインスタンスが返されます.では、これは次のようになります.
LocalDateTime date = new LocalDateTime(Instant.now());

LocalDateTime date = LocalDateTime.ofInstant(Instant.now());
確かに2つの間の広大な違いではない.それで、Factoryメソッドがどんな利益を提供するか.
ファクトリメソッドは名前を持つことができます
私が最初にソフトウェアを開発し始めたとき、私は良いネーミングの力を理解していないと思います.コンストラクタに名前を付ける能力はありません.名前を変えることができないので、同じ順序で同じパラメータをとる2つのコンストラクタを持つことができません.たとえば、LocalDateTimeクラスに追加したい場合は、即座に取得し、提供されるインスタント前にランダムな時刻であるlocalDateTimeを生成するコンストラクターを作成したい場合は、コンストラクタを使用してこれを実現するにはどうしたらよいでしょうか?それは何かのように変更?
LocalDateTime dateTime = new LocalDatetime(Instant.now(), shouldBeBefore);
絶対にない.しかし、ファクトリメソッドを使用すると次のように書くことができました.
LocalDateTime datetime = LocalDatetime.randomTimeBeforeInstant(Instant.now());
多くのクリーナー.
プログラマが使用する別のトリックは、パラメータの順序を変更することですが、これは上記の例と全く同じではないかもしれませんが、将来の開発者が何をするかを知ることは非常に難しいでしょう.したがって、保守性のための大きな勝利ではありません.
ファクトリメソッドは毎回新しいオブジェクトを作成する必要はありません
彼らの性質によるコンストラクターは、彼らが呼ばれるたびに、新しいオブジェクトを作成するのに必要です.これは方法ではそうではない.シングルトンのパターン、最もよく精通しているパターンを考えてください.実際には静的ファクトリメソッドを使用するパターン!SingletonパターンのgetInstanceメソッドの非常に目的は、複数のインスタンスを作成することではありません.他にもオプションがあります.キャッシュされた値またはenumを返す.
ファクトリメソッドは、メソッドの戻り値の型のサブオブジェクトを返すことができます
これは良い能力を持っている.インターフェイスからこの要件を分けることができることは、私たちにオプションを与えます.また、関数に渡されたパラメータに基づいて異なるサブタイプを返す機会も与えられます.したがって、サブタイプを返すことができますが、動的にサブタイプを選択して実行時に返すことができます.これをさらに拡張すると、ファクトリメソッドが書き込まれたときに存在しなかったクラスのインスタンスを返すこともできます.再び、これはより多くのオプションにつながる.良いデザインは、すべてのオプションを開いて残しています.
では、ファクトリメソッドのいくつかの欠点は何ですか
彼らは遺伝を使う能力に影響を与えます
クラスのユーザーをファクトリメソッドとパブリックコンストラクターなしで提供する場合、そのクラスで継承を使用する可能性はありません.これはまた、利益として見ることができます.もう一つの時間は、遺産の上で構成を考慮するために.これは、このメソッドを使用するときに留意しなければならないことです.
彼らはパブリックAPIで見つけるのは難しいことができます
コンストラクタは特別なので、ドキュメントやクラスから飛び出します.では、どのようにこのリスクを減らすことができますか?つのしっかりした方法は、ファクトリメソッドの命名規則の後です.これらのうちのいくつかはgetInstanceからです.
カイルのテイク
私は、これがツール・ベルトのための堅いツールであると思います.私はまだこれを私が毎回行う私のベースケースとして使用して苦労している間、私はこれを念頭に置いて覚えているとしています.パターンについてのもう一つの楽しい部分は、開発に数年後に自分自身がこれらのパターンにつまずいて、実現せずにそれらを使用して下さい.このパターンは何の違いもない.私は私の開発生涯の前に私はsingletonsだけでなく、より一般的な静的工場のメソッドを使用している場所を持っている.あなたがしたことを聞くことは、常に他の人が使っている実際のパターンであることを聞くことです.
あなたは?以前このパターンを使ったことがありますか.どのようにあなたのために働いていますか?