我對建築師模式非常感興趣,我經常使用它,但我不確定我製造的建造者是否足夠好,並且我也懷疑我可以使用它們的所有環境。 這是我如何創建一個建設者的例子:在正確的地方使用正確的建造者
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);
這裏我的一些疑惑:
- 你是否認爲這是真的不可變?如果不是,我該如何改進?
- 關於線程安全。那麼這可能是我的主要疑問。這真的是線程安全的嗎? 我在互聯網上看到一些例子,說類級變量必須是最終的,並通過構造函數傳遞。我還看到一個例子,其中變量被聲明爲volatile。你怎麼看待這件事?
- 您認爲這個構建器在可以使用的場景方面會有什麼限制嗎?我的意思是適合在EJB,JSF支持bean,MDB中調用,或者成爲JPA實體...?
'Builder'應該和'Person'有相同的字段 - 不是另一個'Person'在裏面,'Person'中的所有字段都應該是'final'。 – 2013-02-10 23:33:06
我不是這是一個綜合性問題的粉絲。你還應該考慮刪除諸如「你喜歡我的代碼如何」或「我如何命名」等主觀問題。 – millimoose 2013-02-10 23:39:20
@LouisWasserman看看這個鏈接,我發現有人也是這樣做的。我想刪除重複,但我不知道如果我做得很好:http://xavimiro.blogspot.ie/2008/04/new-builder-pattern.html他建議'volatile'關鍵字,但我是不確定在線程安全方面這是否完全有效。 – sfrj 2013-02-10 23:46:05