关于建造者模式的表现
About performance of builder pattern
为了测试可读性和易写性,我通常在我的值对象中使用BuilderPattern
。例如,不是以标准方式编写这个简单的 class:
public class MyClass{
private String myProperty;
public void setMyProperty(String myProperty){
this.myProperty = myProperty;
}
}
我比较喜欢这样写:
public class MyClass{
private String myProperty;
public MyClass setMyProperty(String myProperty){
this.myProperty = myProperty;
return this;
}
}
这种方法会对性能产生不良影响吗?
您的代码片段不是关于使用构建器模式 (GoF/Bloch),它只是关于使用 fluent mutators
或 chain setters
。没有实际性能影响的常见做法。
关于构建器,您有额外的构建器对象。但是在创建对象后直接有资格进行垃圾收集。
因此您可能会对内存使用产生一些影响。但是 JVM 确实针对处理这个问题进行了优化。
那不是建筑商,建筑商应该是
public class MyClass { // My attrs are immutable now
private final String myProperty;
public MyClass(String myProperty) {
this.myProperty = myProperty;
}
// don't add if you don't need
public String getMyProperty() {
return myProperty;
}
public static class Builder{
private String myProperty;
public MyClass build(){
return new MyClass(myProperty);
}
public Builder setMyProperty(String myProperty) {
this.myProperty = myProperty;
return this;
}
}
public static void main(String[] args) {
new MyClass.Builder()
.setMyProperty("MyValue")
.build();
}
}
这与性能无关,它即将移动构建器上的可变性并使您的模型不可变:现在您只有二传手在构建器级别。
为了测试可读性和易写性,我通常在我的值对象中使用BuilderPattern
。例如,不是以标准方式编写这个简单的 class:
public class MyClass{
private String myProperty;
public void setMyProperty(String myProperty){
this.myProperty = myProperty;
}
}
我比较喜欢这样写:
public class MyClass{
private String myProperty;
public MyClass setMyProperty(String myProperty){
this.myProperty = myProperty;
return this;
}
}
这种方法会对性能产生不良影响吗?
您的代码片段不是关于使用构建器模式 (GoF/Bloch),它只是关于使用 fluent mutators
或 chain setters
。没有实际性能影响的常见做法。
关于构建器,您有额外的构建器对象。但是在创建对象后直接有资格进行垃圾收集。
因此您可能会对内存使用产生一些影响。但是 JVM 确实针对处理这个问题进行了优化。
那不是建筑商,建筑商应该是
public class MyClass { // My attrs are immutable now
private final String myProperty;
public MyClass(String myProperty) {
this.myProperty = myProperty;
}
// don't add if you don't need
public String getMyProperty() {
return myProperty;
}
public static class Builder{
private String myProperty;
public MyClass build(){
return new MyClass(myProperty);
}
public Builder setMyProperty(String myProperty) {
this.myProperty = myProperty;
return this;
}
}
public static void main(String[] args) {
new MyClass.Builder()
.setMyProperty("MyValue")
.build();
}
}
这与性能无关,它即将移动构建器上的可变性并使您的模型不可变:现在您只有二传手在构建器级别。