Java的Builder模式如何修改值

在【Effective Java 】的第2条有提到:遇到多个构造器参数时,考虑用建造者


在设计模式中,也有提到建造者模式。

一、先来看平常所用的方式

一般在Java实体类,都会给予getset方法:

public class User(){
    private String name;
    private String address;
    public User(String name,String address){
        this.name = name;
        this.address = address;
    }
    public String getName(){   
    }
    public void setName(){
    }
    public String getAddress(){  
    }
    public void setAddress(){
    }
}

但实例化后的赋值代码,会显得比较笨重,阅读性比较差。

如果用构造器赋值,有些参数又不一定要传。

二、采用Builder模式

public class User(){
    private final String name;
    private final String address;
    
    public static class UserBuilder(){
        private String name;
        private String address;
        public UserBuilder(){}
        public UserBuilder name(String name){
            this.name = name;
            return this;
        }
        public UserBuilder address(String address){
            this.address = address;
            return this;
        }
        public User build(){
            return new User(this);
        }
    }
    private User(UserBuilder userBuilder){
        this.name = userBuilder.name;
        this.address = userBuilder.address;
    }
    public String getName(){
    }
    public String getAddress(){  
    }
}

这个时候,在实例化时,只需按如下形式使用即可

User user = new User.UserBuilder().name("xxx").address("www").build();

当然,不排除你需要修改User的值,比如把name修改为yyy,然而User的属性已经用final修饰,只提供了get方法,没有set方法,无法设值。

怎么办呢?

在User里加方法:

public class User(){
    /**其他代码**/

    public UserBuilder toBuilder(){
        return new UserBuilder().name(this.name).address(this.address);
    }
}

把user的name修改为yyy:

User user = new User.UserBuilder().name("xxx").address("www").build();
user = user.toBuilder().name("yyy").build();

这个修改的方法,百度了半天,没找着,然后我是编译Lombox搞来的,相当于copy了一个对象。

其实直接用Lombox就行了,省心省事。

-------------------------------------------------------

再次编辑时间:2019-07-27 21:20

注:关于建造者模式,一般如果实体类初始化后,不需要再修改,即类型皆为final,那么可以选择使用。否则,还是不要盲目使用的好。

-------------------------------------------------------

你可能感兴趣的:(java,代码优化方面,builder模式,建造者,javabean,builder模式修改值,修改值)