java - Builder模式中静态类的成员应该是final的吗?

标签 java final builder

所以我看到了一些关于构建器模式的示例。总之,静态类或构建器仅具有那些可以由构造函数初始化的最终成员。示例 -

public class User {
        private final String firstName; // required
        private final String lastName; // required
        private final int age; // optional

    private User(UserBuilder builder) {
            this.firstName = builder.firstName;
            this.lastName = builder.lastName;
            this.age = builder.age;
            this.phone = builder.phone;
            this.address = builder.address;
        }

    public String getFirstName() {
            return firstName;
        }

    public String getLastName() {
            return lastName;
        }

    public int getAge() {
            return age;
        }

    public static class UserBuilder {
            private final String firstName;
            private final String lastName;
            private int age;

    public UserBuilder(String firstName, String lastName) {
                this.firstName = firstName;
                this.lastName = lastName;
            }

    public UserBuilder age(int age) {
                this.age = age;
                return this;
            }
         }
    }

为什么只有名字和姓氏是最终的,可以由构造函数初始化?然后就不能设置了?我的疑问是我不能从 First 和 Last 中删除 Final 并拥有一个初始化所有三个成员并在类中也有相应的 setter 的构造函数吗?

最佳答案

这里的设计是名字和姓氏总是必须设置,但年龄是可选的。 (我会在这里使用Integer,而不是默认为0...但无论如何我更愿意使用birthDate...但我离题了。)

“必需与可选”部分是通过强制在构造中出现名字和姓氏来传达的......那么为什么您还需要 setter 呢?您什么时候想在构造函数中将第一个名称设置为一个事物,然后更改它?

可以使字段成为非最终字段并添加 setter ...我只是认为这不是一件特别好的事情。这不是任何失败的问题,而只是通过 API 设计传达的内容发生了变化。

关于java - Builder模式中静态类的成员应该是final的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27133054/

相关文章:

java - 当我修改 session 中的实体时,hibernate 如何检测到更改

java - Simtay SimpleCRUD 上解析文件 :LazyUserDataModel. java 时出错

Java 不可变类与 volatile 引用

java - Eclipse:作为项目构建器的 Java 应用程序

kotlin - Kotlin 中带接收者的函数字面量说明

ruby-on-rails - Rails 使用正在运行的构建器编写 xml

java - 如何将 jar 附加到正在执行作业的 Spark 集群?

java - 如何在运行时获取通配符上限的类型?

java - 如何初始化一个public static final read-only Linked Map(双向图)

java - 函数中的方法签名覆盖参数中的最终限定符