java基础之builder模式

简介: Builder 使用创建者模式又叫建造者模式

Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。

大家在构建大对象时,对象的属性比较多,我们可以采用一个构造器或者使用空的构造器构造,然后使用setter方法去设置。在使用者使用这些方法时,会很多冗长的构造器参数列表或者setter方法。我们可以使用Builder模式来简化大对象的构造,提高代码的简洁性,同时提高使用者的编码体验。

一个类的定义通常只会有一个地方,而使用这个类的地方会有很多,在定义类时为使用者多考虑一些,就能为使用这个类的开发者提高很多效率,同时让整个团队的代码变的更加简洁。

我一直认为一个类的设计和一个产品的设计者理念相同,产品经理设计一个功能首先能解决用户的痛点,同时还要提高用户体验,让用户用着爽。同样设计一个基础类,需要解决一个业务问题,同时需要从使用者的角度考虑,让使用者用着爽。一个优秀的基础类的设计者需要一点产品思维,代码就是你的产品。

Lombok是一个可以让Java代码变的更加简洁、让你的开发更加高效的利器。使用了Lombok之后,我们不需要写Getter&Setter、ToString等方法,这些都可以通过注解来代替,在编译期间,Lombok会帮助你生成相应的字节码。所以也不用担心性能损失。

Lombok也支持了Builder模式,你可以用几个注解来代替以上冗余的代码。

@Builder

publicclassOrder {

privateStringcode;

@Singular

privateList<String>offers;

@Singular

privateMap<String, Object>features;

}

使用:

Orderorder=Order.builder().code("1234")

  .offer("满100减5")

  .feature("category", "category")

  .build();

@Builder内部操作

  1. 创建一个名为ThisClassBuilder的内部静态类,并具有和实体类相同的属性(称为构建器)。
  2. 在构建器中:对于目标类中的所有的属性和未初始化的final字段,都会在构建器中创建对应属性。
  3. 在构建器中:创建一个无参的default构造函数。
  4. 在构建器中:对于实体类中的每个参数,都会对应创建类似于setter的方法,只不过方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用),如上例所示。
  5. 在构建器中:一个build()方法,调用此方法,就会根据设置的值进行创建实体对象。
  6. 在构建器中:同时也会生成一个toString()方法。
  7. 在实体类中:会创建一个builder()方法,它的目的是用来创建构建器。

@Builder

publicclassUser {

   privatefinalIntegercode=200;

   privateStringusername;

   privateStringpassword;

}

// 编译后:

publicclassUser {

   privateStringusername;

   privateStringpassword;

   User(Stringusername, Stringpassword) {

       this.username=username; this.password=password;

   }

   publicstaticUser.UserBuilderbuilder() {

       returnnewUser.UserBuilder();

   }

   publicstaticclassUserBuilder {

       privateStringusername;

       privateStringpassword;

       UserBuilder() {}

       publicUser.UserBuilderusername(Stringusername) {

           this.username=username;

           returnthis;

       }

       publicUser.UserBuilderpassword(Stringpassword) {

           this.password=password;

           returnthis;

       }

       publicUserbuild() {

           returnnewUser(this.username, this.password);

       }

       publicStringtoString() {

           return"User.UserBuilder(username="+this.username+", password="+this.password+")";

       }

   }

}

1. @Singular

Singular:单一的

@Builder也可以为集合类型的参数或字段生成一种特殊的方法。 它采用修改列表中一个元素而不是整个列表的方式,可以是增加一个元素,也可以是删除一个元素。

Student.builder()

               .sno( "001" )

               .sname( "admin" )

               .sage( 18 )

               .sphone( "110" ).sphone( "112" )

               .build();

这样就可以轻松地将List <String>字段中包含2个字符串。 但是想要这样来操作集合,你需要使用@Singular来注释字段或参数。

在使用@Singular注释注释一个集合字段(使用@Builder注释类),lombok会将该构建器节点视为一个集合,并生成两个adder方法而不是setter方法。

  • 一个向集合添加单个元素
  • 一个将另一个集合的所有元素添加到集合中

将不生成仅设置集合(替换已添加的任何内容)的setter。 还生成了clear方法。 这些singular构建器相对而言是有些复杂的,主要是来保证以下特性:

  1. 在调用build()时,生成的集合将是不可变的。
  2. 在调用build()之后调用其中一个adder方法或clear方法不会修改任何已经生成的对象。如果对集合修改之后,再调用build(),则会创建一个基于上一个对象创建的对象实体。
  3. 生成的集合将被压缩到最小的可行格式,同时保持高效。


目录
相关文章
|
Java
java 两种模式
java 两种模式
107 0
|
Java 应用服务中间件 PHP
Flash Builder4.5 + BladeDS + Java 集成实例
这两天调研一个基于Flex的一个项目和JAVA的集成相关问题,网上有一些资料,不过版本不太一样,而且描述不是很全。 本文把这些内容总结一下,并把例子代码放到了网站上。 Flex是和Silverlight竞争的技术,之所以选择Flex,是由于项目的已经积累基于Flex的内容,后续的项目为了利用和发展因此在这个基础上继续进行。
1165 0
|
Java
一看就会的java8通用Builder
一看就会的java8通用Builder
105 0
|
安全 Java
Java中主要Map类概述
Map: 1、Map的一级接口大概有这三个:SortedMap、ConcurrentMap(1.5)、和Bindings(1.6). SortedMap: 1)、SortedMap的直接接口有NavigableMap(1.6)、间接接口有ConcurrentNavigableMap(1.6)。主要实现类有TreeMap、 ConcurrentSkipListMap(1.6)。
1375 0
Java——18个Demo带你玩转Java中的I/O流
Java——18个Demo带你玩转Java中的I/O流
Java——18个Demo带你玩转Java中的I/O流
Java8-如何构建一个Stream
Stream的创建方式有很多种,除了最常见的集合创建,还有其他几种方式。 List转Stream List继承自Collection接口,而Collection提供了stream()方法。 List list = Lists.newArrayList(1, 2, 3); Stream stream = list.stream(); 数组转stream 对于数组,Arrays提供了stream()方法。
1253 0
|
Java 编译器
java8新特性 (λ、stream 与 默认接口方法)
1.lambda λ表达式本质上是一个匿名方法,用来方便地实现函数接口。也就是说,λ表达式主要用于替换以前广泛使用的内部匿名类。  让我们来看下面这个例子:     public int add(int x, int y) {         return x + y;     } 转成λ表达式后是这个样子:     (int x, int y) -&gt; x + y;
1643 0

热门文章

最新文章