Lombok是一款Java插件,是的Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。
中途会弹出"Acept" 接收 ,最后"restart"就OK
在使用lombok注解的时候记得要导入lombok.jar包到工程
如果使用的是Maven的工程项目的话,要在其pom.xml中添加如下依赖
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
<scope>providedscope>
dependency>
好了,就这几步就可以在Java工程中开始用Lombok这款开发神器了。
Lombok常用注解说明:
- @NonNull:用在方法参数前,会自动对该参数进行非空校验,为空抛出NPE(NullPointerException)
- @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出前会清理资源,生成try-finally的代码关闭流
- @Getter/@Setter:用在属性上,不用自己手写setter和getter方法,还可指定访问范围
- @ToString:用在类上,可以自动复写toString方法
- @EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
- @NoArgsConstructor,@RequiredArgsConstructor,@AllArgConstructor:用在类上,自动生成无参构造和使用所有参数的有参构造函数。
- @Data:用在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对POJO类十分有用。
- @Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法。
- @SneakyThrows:自动抛受检异常,而无需显示的方法上使用throws语句。
- @Synchronized:用在方法上,将方法声明为同步的,并自动加锁。
- @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
@NonNull
注解能够为方法或构造函数的参数提供非空检查
public static void notNullExample(@NotNull String string){
//方法内的代码
}
public static void notNullExample(String string){
if(string != null){
//方法内的代码相当于如下:
}else{
throw new NullPointerException("null");
}
}
@Cleanup
注解能够自动释放资源
优点:
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
- 让代码变得简洁,不用过多的去关注相应的方法。
- 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
- 不支持多种参数构造器的重载
- 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
总结:
- Lombok虽然有很多优点,但Lombok更类似于一种IDE插件,项目也需要依赖相应的jar包。Lombok依赖jar包是因为编译时要用它的注解,为什么说它又类似插件?因为在使用时,eclipse或IntelliJ IDEA都需要安装相应的插件,在编译时通过操作AST(抽象语法树)改变字节码生成,变向的就是说它在改变java语法。
- 它不像spring的依赖注入或者mybatis的ORM一样是运行时的特性,而是编译时的特性。这里我个人最感觉不爽的地方就是对插件的依赖!因为Lombok只是省去了一些人工生成代码的玛法,但IDE都有快捷键来协助生成getter/setter等方法,也非常方便。
知乎上有位大神发表过对Lombok的一些看法:
这是一种低级趣味的插件,不建议使用,Java发展到今天,各种插件层出不穷,如何甄别各种插件的优劣?能从架构上优化你的设计,能提高应用程序性能的,实现高度封装可扩展的……,像lombok这种,这种插件,已经不仅仅是插件了,改变了你如何编写源码,事实上,少去了的代码,你写上去又如何?如果Java家族导出充斥这样的东西,那只不过是一坨披着金属颜色的屎,迟早会被其它的语言取代。