1.前言
在效率至上的今天,开发的速度越来越受到程序员的关注,lombok在这一时代横空出世
正如官网上所言
它是一个java字典,能够帮助你的代码编辑构建工具自动的构建代码,为你的java代码增彩填色,从此再也不用写getter或者equals方法。只需要一个注解就能让你的类拥有全部的构建特性。让你的日志变量也能自动化,还有更多的功能等待你的探索。
官网下载地址
https://www.projectlombok.org/download
更新记录:
2020-10-23 添加
superbuilder介绍
2.注解功能介绍
在这门面向对象的语言里,我们最常做的事就是和对象打交道,这时候在实体类增加一个
@Data
就能代替 getter,setter以及tostring,equals,hashcode
你的实体类会有如此清奇的画风
所有的
getter,setter以及tostring,equals,hashcode
代码都会伴你自动生成,而且这是在编译阶段进行的。完全不影响你拿一个class去执行。如果项目编译时提示警告
Warning:(16, 1) java: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add ‘@EqualsAndHashCode(callSuper=false)’ to your type.
你也可以添加这样的一个注解去掉equals和hashcode方法的继承
@EqualsAndHashCode(callSuper = false)
这时有一个问题就不得不说了,如果你的实体类没有继承父类则可以写false。
如果继承了父类,需要加上@EqualsAndHashCode(callSuper = true),这里设置为true是有原因的,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
如果没有继承父类,添加了@EqualsAndHashCode(callSuper = true)会报这个异常(没有继承父类当然不需要加这个东西)
Error:(15, 1) java: Generating equals/hashCode with a supercall to java.lang.Object is pointless.
大概各位也看到了上图中的@Builder
emmm,这个注解才真正是人性化
@Builder
链式构造对象
如果你在实体类中默认定义了初值。比如
这时编译会报一个警告,
Warning:(35, 21) java: @Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.
就是说使用@Builder后,用链式构造对象时不会默认赋初值,需要你加这么一个注解才能默认设初值
emm,这时候有人会想了,有时候我要做一个线程类
emmm,我要用构造方法给线程的成员变量传值,ok,构造方法你也可以用注解代替
@AllArgsConstructor
有参构造方法
哦有参构造有了,那么我想调用方法本身,还需要一个无参构造,当然,也是一个注解的事儿。
@NoArgsConstructor
无参构造方法
嗯,感觉已经很爽了。
但是还有一个骚操作要悄悄告诉你,java是不允许线程抛出异常的。不信?写一个线程类试试!哪个异常你都得抓一抓,好好try catch 吧。但是,lombok可以让你有骚操作
@SneakyThrows
隐式抛出异常
虽然new Exception对性能什么的都没有好处,但是!!线程里也可以抛出Excrption 。
oh my god ,oracle因言语过激退出了群聊。
oh,还记得官网提到的自动化构造日志变量吗
就是它了
@Slf4j
日志变量
只要类上注解了这个注释
在下边你就可以开心的log.info了
当然
log.error();
log.warn();
也是不会少的
这个功能需要在你的IDE里安装lombok插件,如果不安装的话虽然编译运行都不会出错,但在IDE的编辑页里会报错。
IDE:“咱也不知道log哪里来的,咱也不敢问”。
如果你是处女座,洁癖十分之重。觉得spring的自动注入注解看起来不太顺眼,OK,lombok也能帮你,
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
自动注入
有了这个注解后,
注入就写成了常量,lombok会自动写构造器,实现spring的构造器注入。
@Cleanup
让你告别烦人的try,catch,再在finally块中关闭资源
只需要在新建I/O操作对象时对其注解@Cleanup即可,相当于使用jdk7中已实现的Closeable接口的功能
@Synchronized
同步锁(方法锁或对象锁)这个注解和直接写同步关键字效果效率相同。
@NonNull
参数内容不为空,相当于加上了非空校验