序文
「効果的なJavaの」中国の第三版は、ジャワの基礎についての本で、この本は複数回私に推奨されていました。私のお気に入りの庭のブログブロガー含めCJ月、彼は「類人猿は、いくつかの良い書籍の価値が訪問をお勧めしますJavaプログラムを」自身のブログで働いていたにも推奨されて。各章を読んだ後に決めた良い人、に沿って、エッセイを書きながら、自分の思い出を深めます。あなたは間違った場所、不明瞭な文、または他の提案を書くために持っている場合、私はあなたに感謝し、あなたは私にメッセージを修正することができます願っています。
「効果的なJavaの」中国の第三版読むオンラインリンク:https://github.com/sjsdfg/effective-java-3rd-chinese/tree/master/docs/notes
何ですか
ビルダーモードは、オブジェクトを作成する方法です。オブジェクトモデルのJavaBeans、スケーラブルな方法モードを作成する一般的な方法があります。
どこで使用
あなたは時に4以上の上院に、このような施工方法に到達したときにすることを、手段「オプションのパラメータの多くを」シーンを拡張するための多くのオプションのパラメータ。
ときにエンティティクラス、そしてあなたはそれが後半に新しいフィールドを追加します確信しているあなたがコントロールの外に時間発展へのクラス・パラメータの後半にスタートを使用していないので、あなたはまた、プリビルダーのモードを使用することができます、前に、ビルダーモードに考えます私は、コードは役に立たないだろう書いています。
どのように達成するために
私たちのJavaBeansモデル、スケーラブルな方法モードはBuilderのスキーマ・オブジェクトを作成し、比較の方法は、Builderを達成するために見てみましょう、だけでなく、その利点。
まずは、シナリオ、飲料のボトル、その主原料は、このようなように、ビタミン、水、砂糖、など、多くのがありますを考えてみましょう。次のようなAクラスのコードを実現するために私たちの最初の使用モードスケーラブルな方法:
パブリック クラス。。ドリンク{ // パラメータに必要な水 のプライベート 最終 int型の水; // パラメータに必要な砂糖 民間 最終 int型スウィート; // ビタミンオプションのパラメータ 民間 最終 int型のビタミン; // 飲料ボトルの色、オプションのパラメータ 民間 最終文字列の色。 パブリック。ドリンク(INT水、INT スウィート){ この(水、甘い、0 ); } パブリック。ドリンク(INT水、INT甘い、INT ビタミン){ この(水、甘い、0、 "白色" ); } 公共ドリンク(int型の水、INT甘い、INT ビタミン、文字色){ この .water = 水。 この .sweetは= 甘いです。 この .vitamins = ビタミン; この .color = 色。 } パブリック 静的 ボイドメイン(文字列[]引数){ wowHaHaドリンク = 新しいドリンク(0、0 ); } }
我々は、オブジェクトを作成したいときは、少なくとも参照法へのコンストラクタ(:水、ドリンククラスを作成するには、砂糖の二つの引数の最小上記の例)を作成するために使用することができます。一般に、この方法は、あなたがパラメータを設定する必要はありませんが、あなたは彼らのために値を渡すために持っている何かを渡すことができますスケーラブルな方法モードを作成することができます。10、20は、それが存在する場合、上院に(のみ)の4つの属性上の例では、それほど悪くないように見えることがあり?それはすぐに制御不能になること。
簡単に言えば、多くのパラメータがあり、スケーラブルなモデル構築方法は、それがクライアントの書き込みコードすることは困難であるが、読みにくいです。
「多くのパラメータ」疑問を解決するために、我々は別のオプションは、JavaBeansのモデルを使用することです(コンストラクタは、オプションのパラメータの数に遭遇した)、このモードでは、その後、呼び出し、オブジェクトを作成するには、引数なしのコンストラクタを呼び出す setter
方法を必須およびオプションの各パラメータを設定するには、次のサンプルコード:
パブリック クラスDrink02 { // パラメータに必要な水 のプライベート int型の水; // パラメータに必要な砂糖 プライベート int型スウィート; // ビタミンオプションのパラメータ プライベート int型ビタミン= -1 ; // ボトルの色パラメータ プライベート文字列=色"白」、 パブリックDrink02(){} // セッター 公共 ボイド(setWater INTヴァル){水= ヴァル;} 公共 ボイド setSweet(INTヴァル)= {スウィートヴァル;} 公共 ボイド setVitamins(INTヴァル)= {ビタミン;ヴァル} 公共 ボイド setColorを(文字列ヴァル){色= ヴァル;} // JavaBeanを使用して、オブジェクト・モデルを作成する パブリック 静的 ボイドメイン(文字列[]引数){ Drink02ワッハッハー = 新しい新しいDrink02(); ワッハッハー.setWater( 300 ); waHaHa.setSweet( 10 ); waHaHa.setVitamins( 1。); waHaHa.setColor( "黒いボトル" ); } }
JavaBeansのモード、欠点スケーラブルモードなしの方法が、コードは多少長く見えますが、インスタンスを作成するために便利で、生成されたコードより読みやすいです。
施工方法はJavaBeanのは、一貫性のない状態にあってもよい(工事中)呼の数、ように設定プロパティに分割されているので、JavaBeansのモデルは真剣に、欠陥があります。このクラスは、設定パラメータパラメータの妥当性をチェックすることにより、オプションの一貫性を強制することはありません。多少の誤差が発生することがあり矛盾した状態でオブジェクトを使用してみてください。例えば、必須パラメータを設定する必要がありますが、我々は設定しませんでした。幸いなことに、私たちは第三の選択肢があります:ビルダーモードを次のように、コードの例は以下のとおりです。
パブリック クラスDrink03 { // パラメータに必要な水 のプライベート 最終 int型の水; // パラメータに必要な砂糖 民間 最終 int型スウィート; // ビタミンオプションのパラメータ 民間 最終 int型のビタミン; // 飲料ボトルの色、オプションのパラメータ 民間 最終文字列の色。 パブリック 静的の クラスビルダ{ プライベート 最終 int型の水; プライベート 最終 int型スウィート; プライベート int型ビタミン= 0 ; プライベート文字列の色=「白色」。 公共ビルダー(int型の水、INT 甘い){ この .water = 水; この .sweetは= 甘いです。 } パブリックビルダービタミン(INT ヴァル){ ビタミン = ヴァル。 返す これを。 } パブリックビルダー色(文字列ヴァル){ 色 = ヴァル。 返す これを。 } パブリックDrink03ビルド(){ リターン 新しい Drink03(この); } } プライベートDrink03(ビルダービルダー){ 水 = builder.water。 甘い = builder.sweet。 ビタミン = builder.vitamins。 色 = builder.color。 } // 使用ビルダー模式创建一个对象 パブリック 静的 ボイドメイン(文字列[]引数){ 新しいビルダ(100,10 ) .vitamins( 1).color( "黑色" ).build(); } }
すべてのデフォルトパラメータが一つの場所にあるため、その私たちのDrink03オブジェクトは、セッターの割り当て操作、プロセスが完了している我々ビルダー、我々はチェーンされます呼び出し不変です。あなたがオブジェクトでなく、読みやすいを作成するときにこのコードは非常に簡単に書くことです。
概要
オブジェクト・モデルを作成するためのビルダー
利点:
- より柔軟な。柔軟選択ビルダーオプションのパラメータが自動的に必須パラメータを充填してもよいです。
- より安全な。
短所:
- オブジェクトを作成するには、まずそのビルダーを作成する必要があります。これは空想の機会のパフォーマンスに問題がある可能性があります。また、ビルダーモードは、より詳細なコンストラクタ伸縮モードよりもパラメータが利用価値がそれであるならば、それは十分です。
以上、いくつかの植物のクラスのコンストラクタまたは静的なパラメータを設計する際に結論として、ビルダーモードでは、多くのパラメータが同じまたは別のタイプの場合は特に、良い選択です。伸縮式工法よりもクライアントのコードパターンビルダーは、読みやすく、書き込み、およびビルダーパターンのJavaBeansよりも安全です。