在面向对象编程中必不可少需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此。相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复写Getter/Setter、构造器方法、字符串输出的ToString方法和Equals/HashCode方法等。那么是否一款插件或工具能够替大家完成这些繁琐的操作呢?本文将向大家介绍一款在Eclipse/Intellij IDEA主流的开发环境中都可以使用的Java开发神器,同时简要地介绍下其背后自定义注解的原理。
Lombok的简介
Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。
在Intellij中安装Lombok的插件
想要体验一把Lombok的话,得先在自己的开发环境中安装上对应的插件。下面先为大家展示下如何在Intellij中安装上Lombok插件。
通过IntelliJ的插件中心寻找Lombok并安装
另外需要注意的是,在使用lombok注解的时候记得要导入lombok.jar包到工程,如果使用的是Maven的工程项目的话,要在其pom.xml中添加依赖如下:
1 | <dependency> |
好了,就这么几步后就可以在Java工程中开始用Lombok这款开发神器了。下文将会给大家介绍Lombok中一些注解的使用方法,让大家对如何用这些注解有一个大致的了解。
Lombok注解使用方法
Lombok常用注解介绍
下面先来看下Lombok中主要几个常用注解介绍:
1 | Val 可以将变量申明是final类型 |
Lombok的基本使用示例
(1)val 可以将变量申明是final类型。
1 | public static void main(String[] args) { |
(2)@NonNull注解能够为方法或构造函数的参数提供非空检查。
1 | public void notNullExample(@NonNull String string) { |
(3)@Cleanup注解能够自动释放资源
1 | public void jedisExample(String[] args) { |
(4)@Getter/@Setter注解可以针对类的属性字段自动生成Get/Set方法
1 | public class OrderCreateDemoReq{ |
(5)@ToString注解,为使用该注解的类生成一个toString方法,默认所有的非静态字段都会以键值对的方式输出,可以通过设置includeFieldNames=false不显示键,of设置包含的字段列表,exclude设置要排除的字段。默认的toString格式为:ClassName(fieldName= fieleValue ,fieldName1=fieleValue)
1 | true,exclude="someExcludedField") (callSuper= |
(6)@EqualsAndHashCode注解,为使用该注解的类自动生成equals和hashCode方法,of设置包含的字段列表,exclude设置要排除的字段
1 | true,exclude={"address","city","state","zip"}) (callSuper= |
(7) @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor,这几个注解分别为类自动生成了无参构造器、指定参数的构造器和包含所有参数的构造器
1 | "of")//staticName指定静态方法名称 (staticName = |
(8)@Data注解作用比较全,其包含注解的集合@ToString,@EqualsAndHashCode,所有字段的@Getter和所有非final字段的@Setter, @RequiredArgsConstructor。其示例代码可以参考上面几个注解的组合
(9)@Builder注解提供了一种比较推崇的构建值对象的方式。
@Builder 使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。
@Builder可以放在类,构造函数或方法上。 虽然放在类上和放在构造函数上这两种模式是最常见的用例,但@Builder最容易用放在方法的用例来解释。
使用@Builder注释的方法可以帮助我们完成一下一些事情:
一个名为FooBuilder的内部静态类,并具有和实体类形同的属性(称为构建器)。
在构建器中:对于目标类中的所有的属性和未初始化的final字段,都会在构建器中创建对应属性;
在构建器中:创建一个无参的default构造函数。
在构建器中:对于实体类中的每个参数,都会对应创建类似于“setter”的方法,只不多方法名与该参数名相同。 并且返回值– 是构建- 器本身(便于链式调用),如上例所示。
在构建器中:一个build()方法,调用此方法,就会根据设置的值进行创建实体对象。
在构建器中:同时也会生成一个toString()方法。
在实体类中:会创建一个builder()方法,它的目的是用来创建构建器。
@Singular 实战使用
@Builder
也可以为集合类型的参数或字段生成一种特殊的方法。 它采用修改列表中一个元素而不是整个列表的方式,可以是增加一个元素,也可以是删除一个元素。 例如:
1 | Person.builder() |
这样就可以轻松地将List
在使用@Singular注释注释一个集合字段(使用@Builder注释类),lombok会将该构建器节点视为一个集合,并生成两个adder方法而不是setter方法。
一个向集合添加单个元素
一个将另一个集合的所有元素添加到集合中
将不生成仅设置集合(替换已添加的任何内容)的setter。 还生成了clear方法。 这些singular构建器相对而言是有些复杂的,主要是来保证以下特性:
在调用build()时,生成的集合将是不可变的。
在调用build()之后调用其中一个adder方法或clear方法不会修改任何已经生成的对象。如果对集合修改之后,再调用build(),则会创建一个基于上一个对象创建的对象实体。
生成的集合将被压缩到最小的可行格式,同时保持高效。
@Singular只能应用于lombok已知的集合类型。目前,支持的类型有:
java.util
:
Iterable, Collection, 和List (一般情况下,由压缩的不可修改的ArrayList支持).
Set, SortedSet, and NavigableSet (一般情况下,生成可变大小不可修改的HashSet或者TreeSet).
Map, SortedMap, and NavigableMap (一般情况下,生成可变大小不可修改的HashMap或者TreeMap).
Guava’s com.google.common.collect:
- ImmutableCollection and ImmutableList
- ImmutableSet and ImmutableSortedSet
- ImmutableMap, ImmutableBiMap, and ImmutableSortedMap
- ImmutableTable
代码示例1:
1 |
|
调用实例:
1 | BuilderExample.builder() |
代码示例2:
1 |
|
补充
- @Builder 全局配置
1 | # 是否禁止使用@Builder |
(10)@Synchronized注解类似Java中的Synchronized 关键字,但是可以隐藏同步锁。
1 | public class SynchronizedExample { |