Java lombok 详解
使用原因
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担。而使用了lombok则不一样,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@EqualsAndHashCode或@Data)之后,就不需要编写或生成get/set等方法,很大程度上减少了代码量,而且减少了代码维护的负担。故强烈建议项目中使用lombok,去掉bean中get、set、toString、equals和hashCode等方法的代码。
安装lombok插件:
添加lombok的maven的pom.xml依赖:
<dependency><groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
常用的 lombok 注解
@EqualsAndHashCode:实现equals()方法和hashCode()方法 @ToString:实现toString()方法
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@Cleanup:关闭流 @Synchronized:对象同步 @SneakyThrows:抛出异常
@Data
不使用 lombok 的方案
- public class Person {
private String id;
private String name;
private String identity;
private Logger log = Logger.getLogger(Person.class);
public Person() {
}
public Person(String id, String name, String identity) {
this.id = id;
this.name = name;
this.identity = identity;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getIdentity() {
return identity;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setIdentity(String identity) {
this.identity = identity;
}
}
使用 lombok 的方案
@Data@Log4j
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String id;
private String name;
private String identity;
}
上面的两个 java 类,从作用上来看,它们的效果是一样的,相比较之下,很明显,使用 lombok 要简洁许多
添加lombok的maven的pom.xml依赖:
<dependency><groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Builder
不使用 lombok 的方案
public class Example<T> {private T foo;
private final String bar;
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
}
public static class ExampleBuilder<T> {
private T foo;
private String bar;
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override
public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}
使用 lombok 的方案 guava 16.0.1
@Builderpublic class Example {
private int foo;
private final String bar;
}
构造一个实例,属性不需要单独set
Example.builder().foo(1).bar(“test”).build()
参考:
http://projectlombok.org/features/index.
http://blog.****.net/hack8/article/details/23790579
http://blog.****.net/ethanq/article/details/7185610 [builder模式设计]