有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

类内还是类外的java Builder模式?

在类内和类外使用builder模式的优势是什么

课堂内:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person setName(String name) {
        this.name = name;
        return this;
    }

    public Person setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public Person setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new Person()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")

课外活动:

public class Person {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person(String name, String eyeColor, String hairColor) {
        this.name = name;
        this.eyeColor = eyeColor;
        this.hairColor = hairColor; 
    }  
} 

public class PersonBuilder {
    private String name;
    private String eyeColor;
    private String hairColor;

    public Person build() {
        return new Person(name, eyeColor, hairColor);
    }

    public PersonBuilder with(String name) {
        this.name = name;
        return this;
    }

    public PersonBuilder setEyeColor(String eyeColor) {
        this.eyeColor = eyeColor;
        return this;
    }

    public PersonBuilder setHairColor(String hairColor) {
        this.hairColor = hairColor;
        return this;
    }
} 

// Example usage:
Person p = new PersonBuilder()
                 .setName("Bob")
                 .setHairColor("Black")
                 .setEyeColor("Brown")
                 .build();

共 (2) 个答案

  1. # 1 楼答案

    视情况而定

    我经常结合BuilderFactory模式,因此将生成器作为外部类是有意义的,因为“构建”对象可能是许多实现之一。这还有一个额外的好处,即允许实现是包私有的,甚至是构建器的私有内部类

    如果您使用构建器只是为了让公共类的构造函数更具意图性或更不杂乱,而不是真正的个人偏好。人们可以权衡在API中增加一个类的利弊,这可能会让用户感到困惑

    然而,我建议选择其中一个选项,并在整个API中坚持使用它。如果所有构建器都是内部类或外部类,那么整个系统架构就更容易理解;不要把它们混在一起

    不要这样混合使用内部和外部构建器:

    Foo foo = new Foo.Builder(...)
    
    Bar bar = new BarBuilder(...)
    
  2. # 2 楼答案

    第二个实现确保您将获得一个完成的对象,从而使其实现更加可靠 而第一个字段在设置完所有字段后才显示

    通常,您不希望未声明的对象可用