内联字段初始化与构建器哪个更好
Inline field initialization vs builder which is better
我创建了一个包含很多字段的class,我想根据一些默认值初始化大部分字段,同时根据我的需要及时设置一些字段。我遇到了这个 class.Inline 字段初始化和构建器的两个解决方案。任何意见?我知道构建器模式很流行,但为什么不使用默认的内联字段初始化呢?
//Inline field initialization:
class foo{
int a = 0;
int b = 1;
public foo setA(int a){this.a = a; return this;}
public foo setB(int b){this.b = b; return this;}
}
//use foo
foo f = new foo().setA(1).setB(2);
//builder
class bar(){
int a;
int b;
bar(int a, int b){this.a = a; this.b = b}
public static class Builder(){
int a = 0;
int b = 0;
public bar build(){
return new bar(a, b);
}
public Builder a(int a){this.a = a; return this;}
public Builder b(int b){this.b = b; return this;}
}
}
// use
bar b = bar.Builder.build().a(1).b(2);
使用构建器模式的主要优点是它允许您以任何顺序提供参数。例如,使用内联字段时,您应该始终按此顺序传递 a
和 b
。使用构建器,您可以按任何顺序传递它们。当参数数量对于构造函数而言变得太大时,构建器模式肯定会帮助您创建不可变对象。
当构造函数参数较多时,需要考虑构建器模式。
构造函数不能很好地扩展大量可选参数。
参考:Effective Java http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
中的第 2 项
如果您的字段数不会增加到很大数量,那么我更愿意使用内联字段初始化,因为这意味着编写更少的代码,这总是好的。
我创建了一个包含很多字段的class,我想根据一些默认值初始化大部分字段,同时根据我的需要及时设置一些字段。我遇到了这个 class.Inline 字段初始化和构建器的两个解决方案。任何意见?我知道构建器模式很流行,但为什么不使用默认的内联字段初始化呢?
//Inline field initialization:
class foo{
int a = 0;
int b = 1;
public foo setA(int a){this.a = a; return this;}
public foo setB(int b){this.b = b; return this;}
}
//use foo
foo f = new foo().setA(1).setB(2);
//builder
class bar(){
int a;
int b;
bar(int a, int b){this.a = a; this.b = b}
public static class Builder(){
int a = 0;
int b = 0;
public bar build(){
return new bar(a, b);
}
public Builder a(int a){this.a = a; return this;}
public Builder b(int b){this.b = b; return this;}
}
}
// use
bar b = bar.Builder.build().a(1).b(2);
使用构建器模式的主要优点是它允许您以任何顺序提供参数。例如,使用内联字段时,您应该始终按此顺序传递 a
和 b
。使用构建器,您可以按任何顺序传递它们。当参数数量对于构造函数而言变得太大时,构建器模式肯定会帮助您创建不可变对象。
当构造函数参数较多时,需要考虑构建器模式。
构造函数不能很好地扩展大量可选参数。
参考:Effective Java http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
中的第 2 项
如果您的字段数不会增加到很大数量,那么我更愿意使用内联字段初始化,因为这意味着编写更少的代码,这总是好的。