我对建筑师模式非常感兴趣,我经常使用它,但我不确定我制造的建造者是否足够好,并且我也怀疑我可以使用它们的所有环境。 这是我如何创建一个建设者的例子:在正确的地方使用正确的建造者
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