本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115

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

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构造器和构建器的更多相关文章

  1. Java构造器与构建器的使用

    我们在平常类的构建过程中,可能会面临很多问题,可扩张性.安全性等等.想象一下,这样一个场景,我们现在要创建一个类,其中有6个属性,其中又有4个属性的值是不太确定的(可能某个对象就不需要其中的某个值), ...

  2. 深入探索Java设计模式之构建器模式(五)

    抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...

  3. Java基础——字符串构建器

    StringBuilder类: 可以将许多小段的字符串构建一个字符串. StringBuilder builder = new StringBuilder(); //构造一个空的字符串构建器 buil ...

  4. effective java之使用构建器来创建对象

    第二章第2条:遇到多个构造器参数时要考虑使用构建器(builder) 就是建造者模式(不直接生成想要的对象,而是让客户端利用所有有必要的参数调用构造器或者静态工厂)直接上代码 package com. ...

  5. 【转】通过lombok带你读透Builder构建器

    原地址:https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0 很久之前,我在<effective j ...

  6. Java 构造器 遇到多个构造器时要考虑用构建器

    静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数. 当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式.JavaBeans模式或者Builder模式,但各有优劣. 当 ...

  7. 【读书笔记 - Effective Java】02. 遇到多个构造器参数时要考虑用构建器

    类有多个可选参数的解决方案: 1. 重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然较难以阅读. 2. JavaBeans模式,调用一个无参构造器来创造对象,然后调用sett ...

  8. Java构建器(多个构造器参数)

    今天看netty权威指南,第一次听说构建器,百度了几个博客,但是并没有通俗易懂一点儿的,综合别人的博客,总结如下: 1. 构建器是什么? 当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同 ...

  9. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器

    //构建器抽象类,为不同类的实现提供 public interface Builder<T> { public T build(); } /** * @描述: 营养表 */ public ...

随机推荐

  1. RS-485总线通信协议

    https://blog.csdn.net/ouyangxin95/article/details/78174145 RS-485总线技术只是规定了接口的电气标准,并没有规定RS-485接口的电缆,插 ...

  2. 在Windows .NET平台下使用Memcached (Enyim使用)

    1. 启动并配置Memcached的服务端 1. 下载Memcached  http://download.csdn.net/download/ful1021/7969231 2. 解压到任意目录下, ...

  3. python日志等级输出删选

    有时候我们会删选一下输出的信息 当做日志进行文件保存 但是我们程序中有可能有自己不想存到日志文件中的输出信息 我们要做一些的删选  然后进行保存 代码如下: #!/usr/bin/python # - ...

  4. 如何在同一台电脑上启动多个Tomcat服务器

    安装第二个tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处: (1)修改http范围端口(默认为8080端口) <Connector port=&qu ...

  5. Python通过pip方式安装第三方模块的两种方式

    一:环境 python3.6 windows 10 二:常用命令 如果直接执行pip命令报错,说明pip不在path环境变量中 解决方法: python -m pip list 以下默认可直接使用pi ...

  6. 面试 6:拓展性更好的代码,更容易拿到 Offer

      今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使 ...

  7. gohost -- go 开发的命令行hosts配置管理工具

    前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,

  8. RabbitMQ教程(二) ——linux下安装rabbitmq

    安装过程参考官网: Installing on RPM-based Linux (RHEL, CentOS, Fedora, openSUSE) 首先需要安装erlang,参考:http://fedo ...

  9. SQL 显示表名显示列名

    显示表名:show 表名: 显示列(Field)名:show columns from 表名:

  10. python第三章:循环语句--小白博客

    Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非 ...