JavaBean之Builder模式
来源:互联网 发布:乐思网络信息采集系统 编辑:程序博客网 时间:2024/06/05 20:29
静态工厂和构造器
重载构造函数,分别包含多个不同的参数
无法很好地扩展到大量的可选参数
JavaBean方式
调用一个无参构造函数来创建对象,然后通过setter方法来设置必要参数
对象构造过程被分割到了几个调用,构造过程中可能导致JavaBean处于不一致的状态,类无法通过检验构造器参数的有效性来保证一致性
Builder模式
不直接生成想要的对象,通过调用构造器(或静态工厂),得到builder对象,客户端在builder对象上调用类似setter方法,来设置每个相关的可选参数,最后,再调用build方法来生成不可变对象
public class Person { @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", address='" + address + '\'' + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } private String name; private String address; private String firstName; private String lastName; private Person(String name, String address, String firstName, String lastName) { this.address = address; this.name = name; this.lastName = lastName; this.firstName = firstName; } public static Builder builder() { return new Builder(); } public static class Builder { private String name; private String address; private String firstName; private String lastName; public Builder name(final String name) { this.name = name; return this; } public Builder address(final String address) { this.address = address; return this; } public Builder lastName(final String lastName) { this.lastName = lastName; return this; } public Builder firstName(final String firstName) { this.firstName = firstName; return this; } public Person build() { return new Person(name, address, firstName, lastName); } }}
客户端调用
Person p = new Person.Builder().address("上海").firstName("三").lastName("张").name("欧阳").build(); System.out.println(p); Person person = Person.builder().address("上海").firstName("三").lastName("张").name("欧阳").build(); System.out.println(person);
如果我们使用IDE,我们可以直接使用Lombok插件的@Builder注解,仅需声明类属性
@Builder@ToStringpublic class LombokPerson { private String name; private String address; private String firstName; private String lastName;}
查看生成的class源码
public class LombokPerson { private String name; private String address; private String firstName; private String lastName; @ConstructorProperties({"name", "address", "firstName", "lastName"}) LombokPerson(String name, String address, String firstName, String lastName) { this.name = name; this.address = address; this.firstName = firstName; this.lastName = lastName; } public static LombokPerson.LombokPersonBuilder builder() { return new LombokPerson.LombokPersonBuilder(); } public String toString() { return "LombokPerson(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")"; } public static class LombokPersonBuilder { private String name; private String address; private String firstName; private String lastName; LombokPersonBuilder() { } public LombokPerson.LombokPersonBuilder name(String name) { this.name = name; return this; } public LombokPerson.LombokPersonBuilder address(String address) { this.address = address; return this; } public LombokPerson.LombokPersonBuilder firstName(String firstName) { this.firstName = firstName; return this; } public LombokPerson.LombokPersonBuilder lastName(String lastName) { this.lastName = lastName; return this; } public LombokPerson build() { return new LombokPerson(this.name, this.address, this.firstName, this.lastName); } public String toString() { return "LombokPerson.LombokPersonBuilder(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")"; } }}
客户端调用:
LombokPerson lombokPerson = LombokPerson.builder().address("上海").firstName("三").lastName("张").name("欧阳").build(); System.out.println(lombokPerson);
https://dzone.com/articles/too-many-parameters-java-1
阅读全文
0 0
- JavaBean之Builder模式
- 使用 Builder 模式构造 JavaBean 的好处
- 使用 Builder 模式构造 JavaBean 的好处
- 使用 Builder 模式构造 JavaBean 的好处
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- 设计模式之Builder
- android inflater详解以及源码解析
- Educational Codeforces Round 33 (Rated for Div. 2) 893B. Beautiful Divisors
- php install
- lintcode 6. 合并排序数组
- Java笔记杨枝12.2
- JavaBean之Builder模式
- [USACO1.4]母亲的牛奶Mother's Milk dfs
- HashMap源码剖析
- 小波变换中的信号扩展(延拓)问题
- 分治法的概念以及应用
- java鬼混笔记:redis 3、java下使用redis,自定义一个工具类RedisUtil
- Ubuntu/16.04LTS+Apache/2.4.18 环境下实现Python CGI编程
- miniUI的datagrid表格编辑时将原有的值带出来的技巧
- ArrayList源码剖析