java - 从 JavaBeans 更改为 Builder 模式

标签 java design-patterns javabuilders

我在我的应用程序中使用 Retrofit,我有用于发出请求和解析响应的 POJO 类。目前我正在使用 JavaBeans 模式,并且为所有 POJO 类的类中的所有变量提供 getter 和 setter。

这是我的用户类别的例子

public class User {
    @SerializedName("user_name")
    private String userName;
    @SerializedName("password")
    private String userPassword;
    @SerializedName("address_info")
    private AddressInfo AddressInfo;
    @SerializedName("contact_info")
    private ContactInfo ContactInfo;

    /* 
      *@return The userName
    */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName The userName
     */

    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return The userPassword
     */

    public String getPassword() {
        return userPassword;
    }

    /**
     * @param userPassword The userPassword
     */

    public void setPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    /// so on for the AddressInfo and ContactInfo
}

这很有效。我正在尝试使用构建器模式而不是 JavaBeans 模式。

我将我的用户类别更改为:

public class User {
    @SerializedName("user_name")
    private String userName;
    @SerializedName("password")
    private String userPassword;
    @SerializedName("address_info")
    private AddressInfo AddressInfo;
    @SerializedName("contact_info")
    private ContactInfo ContactInfo;


    public static class UserBuilder {

        private String userName;
        private String userPassword;
        private AddressInfo AddressInfo;
        private ContactInfo ContactInfo;

        //builder methods for setting property
        public UserBuilder userName(String user_name) {
            this.userName = user_name;
            return this;
        }

        public UserBuilder userPassword(String user_password) {
            this.userPassword = user_password;
            return this;
        }

        public UserBuilder AddressInfo(AddressInfo addressInfo) {
            this.AddressInfo = addressInfo;
            return this;
        }

        public UserBuilder ContactInfo(ContactInfo contactInfo) {
            this.ContactInfo = contactInfo;
            return this;
        }

        //return fully build object
        public User build() {
            return new User(this);
        }
    }

    //private constructor to enforce object creation through builder

    private User(UserBuilder builder) {
        this.userName = builder.userName;
        this.userPassword = builder.userPassword;
        this.AddressInfo = builder.AddressInfo;
        this.ContactInfo = builder.ContactInfo;
    }

//Getters for userName,userPassword,AddressInfo and ContactInfo
}

AddressInfo 类

public class AddressInfo {
    @SerializedName("address_1")
    private String address1;
    @SerializedName("city")
    private String city;
    @SerializedName("state")
    private String state;
    @SerializedName("zip_code")
    private String zipCode;

    /**
     * @return The address1
     */
    public String getAddress1() {
        return address1;
    }

    /**
     * @return The city
     */
    public String getCity() {
        return city;
    }

    /**
     * @return The state
     */
    public String getState() {
        return state;
    }

    /**
     * @return The zip code
     */
    public String getZipCode() {
        return zipCode;
    }
}

问题: 1. 我从 AddressInfo 和 ContactInfo POJO 类中删除了 setter。我是否还需要在 AddressInfo 和 ContactInfo 类中实现构建器模式?这就是模式的工作原理吗?

  • 我怎样才能实现这一目标:

      User user = new User.UserBuilder().userName("test").userPassword("******").address("100 Townsend St").city("San Francisco").zip("94107").build();
    
  • 最佳答案

    User user = new User.UserBuilder().userName("test")
        .userPassword("******").address("100 Townsend St")
        .city("San Francisco").zip("94107").build();
    

    你会把东西搞混的。 UserBuildr 应该负责使用其地址/联系信息来构建用户,而不是同时构建它们。您应该为 User 类中的 AddressInfoContactInfo 实例提供 getter 和 setter,并在 UserBuilder< 中提供设置它们的方法。为每个对象创建一个构建器并像这样使用它们。

    User user = new User.UserBuilder().userName("test")
        .userPassword("******").addressInfo.(new AdressInfo.Builder()
            .address1("100 Townsend St")
            .city("San Francisco").zip("94107").build()).build();
    

    ContactInfo 执行相同的操作。

    如果您不希望外部访问 AddressInfoContactInfo 的 setter ,您可以对它们进行保护,构建器仍然可以访问它们,因为它是内部类。

    关于java - 从 JavaBeans 更改为 Builder 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017524/

    相关文章:

    java - 如何忽略 Eclipse 中的顶级源文件夹?

    c++ - 递归模板成语如何避免基类是子类的 friend

    design-patterns - 无用的接口(interface)

    java - 内部编译器错误 : Classcast exception

    java - Jenkins:如何在两台服务器上构建和部署单个作业

    java - Microsoft graph REST API 响应与 Microsoft live sdk 相同吗?据我们所知,live sdk 现已停用

    java - 我无法转发代理类中的异常

    java - 在 List 的每个索引上创建 ArrayList

    java - 在类中保存密码的最理想方式 - Java