私はビルダーパターンに非常に興味があり、頻繁に使用しますが、作成するビルダーが十分に優れているかどうかはわかりません。また、それらを使用できるすべての環境について疑問があります。これは、ビルダーを作成する方法の例です。
public class Person {
private String name;
private String secondName;
private int age;
public static class Builder {
private boolean isBuilt;
private Person person = new Person();
private void check() {
if (isBuilt) {
throw new IllegalStateException(
"The object cannot be modified after built");
}
}
public Builder withName(String name) {
check();
person.name = name;
return this;
}
public Builder withSecondName(String secondName) {
check();
person.secondName = secondName;
return this;
}
public Builder withAge(int age) {
check();
person.age = age;
return this;
}
public Person build() {
check();
isBuilt = true;
return person;
}
}
@Override
public String toString() {
return "Name: " + name + "\nSecond name:" + secondName + "\nAge:" + age;
}
}
簡単な使用例:
Person person = new Person.Builder()
.withName("John")
.withSecondName("Smith")
.withAge(50)
.build();
System.out.println(person);
ここに私の疑問のいくつかがあります:
- 本当に不変だと思いますか?いいえの場合、どうすれば改善できますか?
- スレッドセーフについて。さて、これはおそらく私の主な疑問です。これは本当にスレッドセーフですか?私はインターネットで、クラスレベルの変数はfinalであり、コンストラクターを介して渡される必要があるという例を見ました。また、変数が揮発性として宣言された1つの例を見ました。あなたはそれについてどう思いますか?
- このビルダーは、それを使用できるシナリオに関して何か制限があると思いますか?つまり、EJB、JSFバッキングBean、MDBのいずれかで呼び出されるか、JPAエンティティになるのが適切でしょうか...?