内联字段初始化与构建器哪个更好

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);

使用构建器模式的主要优点是它允许您以任何顺序提供参数。例如,使用内联字段时,您应该始终按此顺序传递 ab。使用构建器,您可以按任何顺序传递它们。当参数数量对于构造函数而言变得太大时,构建器模式肯定会帮助您创建不可变对象。

当构造函数参数较多时,需要考虑构建器模式。 构造函数不能很好地扩展大量可选参数。
参考:Effective Java http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
中的第 2 项 如果您的字段数不会增加到很大数量,那么我更愿意使用内联字段初始化,因为这意味着编写更少的代码,这总是好的。