目录
链式编程
定义
代码示例
编辑 @Accessors(chain=true) 开启链式编程
编辑
@Accessors(chain = true,fluent = true) 去除set和get
构建模式
定义
代码示例
编辑 踩坑
@Singular
定义
代码示例
踩坑默认值情况
编辑
@With
定义
代码示例
链式编程
定义
链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果。
代码示例
我们平常在创建对象的时候,需要对对象的属性进行设置,传统的设置形式如下
@Accessors(chain=true) 开启链式编程
lombok提供了@Accessors注解可以很方便地开启链式编程
在structure可以很方便地查看下该类生成的方法
可以看到该类的三个设置属性方法最后返回的都是该类本身
从而实现了链式编程的效果
@Accessors(chain = true,fluent = true) 去除set和get
@Accessors还可以根据fluent属性来去除set和get的方法名冗余
可以看到原先的getAge(),setAge()等方法名前的set和get都被省略掉了
构建模式
定义
Builder使用创建者模式又叫建造者模式简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程.
代码示例
可以查看编译后的student类源码
踩坑
注意前面只使用了@Builder @Data这两个注解来定义该类,然而@Data注解默认是包含了@AllArgsConstructor(全属性有参构造) @NoArgsConstructor(无参构造)这两个注解的,但是一旦加了@Builder注解后,其无参构造会失效,也就是说原先的new Student()创建实体方法会报错:
可以看到有参构造还是可以用的,但是无参构造已经失效,所以这里还需要额外单独添加@NoArgsConstructor注解来配合使用
但是如果加了@NoArgsConstructor注解那么有参构造又出幺蛾子也失效了,所以这里@AllArgsConstructor也需要额外单独添加
这样的话无论是构建还是原先的new 实例都可以了
@Singular
定义
@Singular是Lombok中的注解之一,它用于在生成的Builder模式中处理集合类型的属性。
当我们在类中使用@Singular注解时,它会为属性生成一个特殊的setter方法,这个方法接收单个元素作为参数,而不是整个集合。在使用Builder模式创建对象时,我们可以逐个添加元素,而不需要手动创建集合或使用addAll方法。
代码示例
现在在Student中添加一个集合属性List<String>
然后使用构建模式来为它设置属性值
可以看到设置集合类型的数据时需要直接传入一个List<String> 类型的数据
可以通过@Singular来方便地设置集合类型的数据
它会生成一个默认的添加单个该集合属性元素的方法
注意方法名是默认的,如果不想使用默认的还可以对其value属性设置方法的名字
当然它与原先的添加集合的属性方法并不冲突,还可以两者混用
注意
@Singular只能应用于lombok已知的集合类型。目前,支持的类型有:
java.util:
Iterable, Collection, 和List (一般情况下,由压缩的不可修改的ArrayList支持).
Set, SortedSet, and NavigableSet (一般情况下,生成可变大小不可修改的HashSet或者TreeSet).
Map, SortedMap, and NavigableMap (一般情况下,生成可变大小不可修改的HashMap或者TreeMap).
踩坑默认值情况
如果该对象使用lombok的构建模式,其默认值这里会失效
可以看到hobby属性默认值为null
这里需要添加@Builder.Default 注解来设置属性默认值
此时hobby属性就是默认值了
@With
定义
@With是Lombok中的注解之一,它可以用于生成一个新的实例,该实例是原实例的一份副本,但具有某些属性被修改的特点。
当我们在类中使用@With注解时,它会为被注解的属性生成一个特殊的setter方法,该方法接收新的属性值,并返回一个新的实例,而不会修改原实例。这使得我们可以在不直接修改原实例的情况下,创建一个新实例并修改其中的属性值。
代码示例
比如这里给name属性添加@with注解
测试
可以看到添加了@with注解的name属性一旦被更改就会产生新的引用实例,注意这里并不是set方法,而是withName方法了