QiitaQiitaの最新情報を7時、12時、19時にTwitterでお届けします。JavaPythonJavaScriptRailsRubyAWSPHPdockerJavavue.jsSwiftAndroidiOSC#UnityLinuxNode.jslaravelGoCSSGitHTMLReactMacMySQLC++TensorFlowDeepLearningKotlinSQL新人プログラマ応援201912022020/02/282020/02/272020/02/262020/02/252020/02/242020/02/232020/02/222020/02/212020/02/202020/02/1920191202のJavaに関する記事は11件です。LombokのBuilderパターンについて解説します。「Builderパターン」とは?GoFのデザインパターンの一種で、生成処理を積み上げてインスタンスを生成するパターンです。処理を積み上げて生成していく様子から「Builder(建築者)パターン」と呼ぶようです。plugin:0.27-2019.02Builderパターンの適用方法Builderパターンを適用するクラスを定義します。付けることでBuilderが自動生成されます。isFoo;}この実装により、以下のコードが自動生成されます。}}自動生成されたコードのクラス図コードのみを読んでも頭に入りにくいため、クラス図を作成しました。PlantUMLで表現する方法がわからなかったのですが、FooFooFooDtoBuilderクラスはstaticです。入れ子になっているクラスを表しています。今回だとFooFooFooDtoBuilderクラスはFooFooFooDtoクラスの内部で定義されています。追加された全処理を紹介します。以下の手順でインスタンスを生成します。(ここではFooFooFooDtoBuilder)を返すのがポイントで、これによりメソッドチェーンでインスタンスを生成できます。メソッドとプロパティが同名なのもわかりやすいです。イメージはこんな感じです。メリットインスタンスの生成処理がスッキリするメソッドチェーンでプロパティを初期化できるため、変数名を毎回書かずにスッキリします。Setterでセットすると毎回変数名を書く必要があります。.build();プロパティが他で変更されないことを確約できるSetterでセットするとバラバラに書けてしまいます。...fooFooFooDto.isFoo(true);バラバラに書けると、追うのに時間がかかって可読性が下がります。まとまって書かれていても、他で変更されているか確認する手間がかかります。どのプロパティを初期化しているかわかりやすいお気づきの方もいると思いますが、上記の2つはコンストラクタで解決できます。true);しかし、コンストラクタは呼び出し時に引数名を書けないので、どのプロパティを初期化しているかわかりづらいです。引数を書く順番も決まっていて、好きな順番で初期化できません。書けないBuilderパターンを適用すると、どのプロパティを初期化しているかわかりやすく、初期化する順番も自由に決められます。.build();引数が多いと渡す順番がわからなくなりますが、Builderパターンだとそれがありません。.build();IDEによっては引数名が表示され、Builderパターンを適用しなくても実装しやすいことがあります。それでも、コードレビュー時などIDEを使わないときは可読性が低いままなので、Builderパターンは効果的です。メソッドチェーンがカッコいいこれが一番のメリットです。(私調べ)やはりメソッドチェーンで書けるとカッコいいです。APIと組み合わせるとカッコよさが増します。.collect(Collectors.toList());デメリット同一パッケージ内だとインスタンスをnewできる自動生成されるコンストラクタにはアクセス修飾子が付かないため、同一パッケージ内だとコンストラクタ経由でインスタンスを生成できてしまいます。すれば解決できそうですが、何かそうしない理由があるのかもしれません。同等のコンストラクタを生成しています。生成すれば、コンストラクタ経由でインスタンスが生成されることを防げます。}}インスタンスの生成方法が複数あると混乱するので、こちらの実装をデフォルトにしてほしいです...。理由はわかりませんでした。しないといけないので...。プロパティの初期化を強制できないコンストラクタではプロパティの初期化を強制できますが、Builderパターンでは強制できません。.build();あとから追加したプロパティの初期化を忘れやすいため、頻繁にプロパティを追加するクラスには適用しない方がよさそうです。Builderパターンの用途データを受け渡すためだけに使うDTOに適用すると効果的です。付けているため、このままだとプロパティの値を取得できません。付けると全プロパティにGetterが追加されるのでオススメです。isFoo;}もし外部に公開したくないプロパティが存在する場合、プロパティごとにGetterを付ければOKです。付けることで、デフォルト値を設定できます。付けていても使えるので便利です。付けていても使えるのかは、自動生成されるコードを見るとわかります。}}応用:継承しているクラスにBuilderパターンを適用する継承しているクラスにBuilderパターンを適用しようとすると、親クラスのプロパティを考慮しないためビルドエラーになります。実装を工夫する必要があり、以下の記事が参考になります。