質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

1回答

812閲覧

Effective JavaにおけるBuilderパターンを用いた実装についての指摘に関して

Zax_XK

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

1グッド

3クリップ

投稿2017/12/07 06:55

お世話になります。
掲題の件について意見をお聞かせ下さい。

先日、Effective JavaにおけるBuilderパターンを用いた実装を行ったところ、コードレビューにおいて、

「Builder自身をコンストラクタの引数に渡してしまうと、コンストラクタ内でもしbuild()を呼び出された場合に無限の再帰呼び出しとなってしまう為よろしくない。やるのであれば、Builderの内部でパラメタ用のクラスを組み立て、それを渡すような作りが良い。」

との指摘を受けました。

Effective JavaのBuilderの実装そのものに対する指摘になっている感じなのですが。
プラスでパラメタクラスを作るのも無駄な感じがあり、
外部に対して渡している訳でもなく、正直そこまで考慮する必要はないのでは?と感じたのですが、意見をお聞きしたく。

 
よろしくお願いします。

LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/12/07 11:20

どういうコードなのか掲載してください。
Zax_XK

2017/12/07 11:57

質問の意図が不明瞭で、伝わり辛く申し訳ありません。自身が書いたコードに対するというより、BuilderパターンでコンストラクタにBuilderを渡す事に対して、コンストラクタ内でbuild()が呼ばれた場合の考慮不足であるという指摘点に関して、そこまで考慮する必要があるかどうかという意見を参考までにお聞きしたかった次第です。Builderの書き方や構成はhttps://qiita.com/disc99/items/840cf9936687f97a482b等で紹介されているEffective Javaのパターンと同一のものです。
guest

回答1

0

ベストアンサー

Effective JavaのBuilderの実装そのものに対する指摘になっている感じなのですが。

本に書いてあるから正解とは言えないですね。
指摘内容も妥当な懸念点だと思います。

外部に対して渡している訳でもなく、正直そこまで考慮する必要はないのでは?と感じたのですが、

build()を呼ぶことには、下記と同じことだと思います。

private static class A { public A() { new B(); } } private static class B { public B() { new A(); } }

このようなコード書くことは防げないが、テストコード、レビュー等でカバーする必要がありますね。

プラスでパラメタクラスを作るのも無駄な感じがあり、

Effective JavaにおけるBuilderパターンは、私も見たことあって、よくないな思ったことあります。
具体的には、生成対象のオブジェクトと同じ属性を定義しているところです。
今回指摘された内容を踏まえて、下記のように書くのはどうかなと。

java

1public class People { 2 3 private String name; 4 private Integer age; 5 private String hobby; 6 7 static class Builder { 8 private People people = new People(); 9 10// private String name; 11// private Integer age; 12// private String hobby; 13 14 Builder(String name, Integer age) { 15 people.age = age; 16 people.name = name; 17 } 18 19 Builder hobby(String hobby) { 20 people.hobby = hobby; 21 return this; 22 } 23 24 People build() { 25 if (people.name == null || people.age == null) { 26 throw new NullPointerException(); 27 } 28 29 return this.people; 30 } 31 } 32 33// private People(Builder builder) { 34// this.name = builder.name; 35// this.age = builder.age; 36// this.hobby = builder.hobby; 37// } 38 39 String hello() { 40 return "hello"; 41 } 42}

投稿2017/12/08 03:15

liguofeng29

総合スコア801

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zax_XK

2017/12/08 11:16

ご回答いただき有難うございます。 >本に書いてあるから正解とは言えないですね。 仰る通りです。 Effective Java自体はかなり有名な書籍ですが、だからといってそれをそのまま鵜呑みにするのは良くないなと今回のレビューを以て考えさせられた次第です。 特にネット上ではそのままの形でお勧めされていたりするので、特に初心者や中級者であればあまり深く考えずに使ってしまうなと思います。(まさに今回の自分ですね。。) >build()を呼ぶことには、下記と同じことだと思います。 >このようなコード書くことは防げないが、テストコード、レビュー等でカバーする必要がありますね。 なるほど確かに、このように書くことは防ぎようがないし、等価と考えるとレビューやテストでフォローする必要があるなと思わされます。 >具体的には、生成対象のオブジェクトと同じ属性を定義しているところです。 その点は自分も感じました。 二重に同じプロパティを書く必要がある事で、変に無駄を増やしているような気がします。 具体的な改善例もご提示いただいて大変有難うございます。 貴重なご意見、参考とさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問