java进阶-创建和销毁对象2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wcandy001/article/details/49765961

第二条:遇到多个构造器参数时要考虑用构建器

场景:当一个类创建对象时需要传参数的时候,例如

public class Person
{
    private int age;
    private String name;
    private String school;
                ....
}
//通常使用的方法是
Person(int age,String name,String school)
{
    this.age=age;
    this.name=name;
    this.school=school;
}
//那么问题来了,如果我需要创建一个对象,但他并没有school属性怎么办?用上面的构造方法需要
Person jacker =new Person(22,"jacker","null");
//对象的属性就会发生了变化,而当数据量比较大的时候我们没有能力记录各种各样的非正常数据所表示的含义
//或许你会说可以再定义一个构造器
Person(int age,String name)
//但是参数位置和类型都需要去记忆,稍有不慎就会出现错误,详细请看上一个博客

//或许有人会考虑无参数构造器+set+get的方法给每个参数传值,如
Person(){}
public void setAge(String age)
{
    this.age=age;
}
public String getAge()
{
    return this.age;
}
      ....
//这样虽然会弥补上一个的不足,而且代码的可读性很好,但是,如果线程是不安全的,那么每个对象在定义属性的时候可能会发生混乱

//第三种方法
public class Person
{
    private int age;
    private String name;
    private String school;
    private String classNumber;
    public static class Builder
    {
        private int age;
        private String name;
        private String school;
        private String classNumber;
        public Builder(int age,String name)
        {
            this.age=age;
            this.name=name;
        }
        public Builder school(String school)
        {
            this.school=school;
            return this;
        }
        public Builder classNumber(String classNumber)
        {
            this.classNumber=classNumber;
            return this;
        }
        public Person build()
        {
            return new Person(this);
        }
    }
    private Person(Build build)
    {
        this.age=build.age;
        this.name=build.name;
        this.school=build.school;
        this.classNumber=classNumber;
    }
}

//使用方法
Person jacker=new Person.Build(22,"jacker").school("null").classNumber("null").build();
//和上面的两种构造方法比起来,很明显就可以看出这个jacker对象的school和classNumber属性是"null"
//这种方法很容易编写,也易于阅读,但是他的缺点就在于创建构建器的开销比以上两种都要大,只能用于对性能要求不是特别注重,而且参数比较多的情况下

猜你喜欢

转载自blog.csdn.net/wcandy001/article/details/49765961