资讯专栏INFORMATION COLUMN

构造器还是构建器?

muzhuyu / 1327人阅读

摘要:更多关于的文章请戳这里您的留言意见是对我最大的支持我的文章列表

在实例化一个类的过程中,通常会遇到多个参数的构造函数,但如果有些参数是非必需的呢?每次都要初始化那么多参数么?

public class Person {
    private int id;//身份证号
    private String name;//姓名
    private int age;//年龄
    private boolean sex;//性别
    private String desc;//个人描述
    public Person(int id, String name, int age, boolean sex, String desc) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.desc = desc;
    }
}

或者像下面这样,创建一个必选参数的构造器,在创建几个可选参数的构造器?

    public Person(int id, String name) {//两个参数的
        this.id = id;
        this.name = name;
    }

    public Person(int id, String name, int age) {//三个参数的
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Person(int id, String name, int age, boolean sex) {//四个参数的
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

或setter方法?

JavaBean模式自身有严重的缺点,因为构造过程被分到几个调用中,在构造过程中Javabean可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。JavaBean模式阻止了把类做成不可变的可能,这就需要程序员付出额外的努力确保线程安全 ---摘自Effective Java

那么我们该怎样用构建器来实现类的实例化而又不受制于构造函数限制呢?

public class Person {
    private final int id;//身份证号
    private final String name;//姓名
    private int age;//年龄
    private boolean sex;//性别
    private String desc;//个人描述
    private Person(Builder builder){
        this.id=builder.id;
        this.name=builder.name;
        this.age=builder.age;
        this.sex=builder.sex;
        this.desc=builder.desc;
    }
    public static class Builder{
        private final int id;
        private final String name;
        private int age;
        private boolean sex;
        private String desc;
        public Builder(int id, String name) {
            this.id = id;
            this.name = name;
        }
        public Builder age(int age){
            //年龄合法性检查
            if(age<0)throw new IllegalArgumentException();
            else this.age=age;
            return this;
        }
        public Builder sex(boolean sex){
            this.sex=sex;
            return this;
        }
        public Builder desc(String desc){
            this.desc=desc;
            return this;
        }
        public Person build(){
            return new Person(this);
        }
    }

    @Override
    public String toString() {
        return "id:"+this.id+" 姓名:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex+" 描述:"+this.desc;
    }
}

我们在main函数中测试一下

    public static void main(String[] args) {
        Builder builder=new Person.Builder(123,"张三");
        Person person=builder.age(18).sex(false).desc("好好学习,天天向上").build();
        System.out.println(person.toString());
    }

用构建器创建的实例易于阅读和编写,较javaBean模式又更加安全,自然,自然,每种方法都会有其优点和弊端,选择合适的使用场景,会让代码更加健壮易读。

更多关于java的文章请戳这里:(您的留言意见是对我最大的支持)

我的文章列表

Email:sxh13208803520@gmail.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66957.html

相关文章

  • 第2项:当面临多个参数的构造时考虑使用构建

    摘要:因此,最好一开始就考虑使用构造器。与使用传统的重叠构造器模式相比,使用模式的客户端代码更易于阅读和编写,构建器也比更加安全。   静态工厂和构造器有个共同的局限性:他们都不能很好地扩展到大量的可选参数。考虑用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过20个可选域:总脂肪、饱和脂肪量、转化脂肪、胆固醇、钠等等。大...

    KavenFan 评论0 收藏0
  • 第6章:可维护性软件构建方法 6.3可维护性构建技术

    摘要:遵循特定规则,利用操作符,终止节点和其他非终止节点,构造新的字符串非终结符是表示字符串的树的内部节点。语法中的生产具有这种形式非终结符终结,非终结符和运算符的表达式语法的非终结点之一被指定为根。 大纲 基于状态的构建 基于自动机的编程 设计模式:Memento提供了将对象恢复到之前状态的功能(撤消)。 设计模式:状态允许对象在其内部状态改变时改变其行为。 表驱动结构* 基于语法的构...

    young.li 评论0 收藏0
  • Java™ 教程(StringBuilder类)

    StringBuilder类 StringBuilder对象与String对象类似,只是它可以被修改,在内部,这些对象被视为包含一系列字符的可变长度数组,在任何时候,可以通过方法调用来改变序列的长度和内容。 除非字符串构建器在更简单的代码(参见本节末尾的示例程序)或更好的性能方面提供优势,否则应始终使用字符串,例如,如果需要连接大量字符串,则附加到StringBuilder对象会更有效。 长度和容...

    daryl 评论0 收藏0
  • C++list类模拟实现

    摘要:类模拟实现类的基本结构结点类成员变量成员函数迭代器类成员函数解引用运算符重载箭头运算符重载迭代器前置迭代器后置迭代器的比较链表类成员变量成员函数构造函数拷贝构造赋值重载析构函数其他小型接口类的基本结构中是一个双向带头循环链表。 ...

    894974231 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<