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}