1、官方介绍
官网
官方下载地址(lombok.jar)
简介
任何技术的出现都是为了解决某一类问题,以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,因此,Lombok应运而生。
Lombok的优缺点
优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率让代码变得简洁,不用过多的去关注相应的方法属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
不支持多种参数构造器的重载虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
2、使用
引入Lombok
<dependency>
<groupId>org
.projectlombok
</groupId
>
<artifactId>lombok
</artifactId
>
<version>1.18.16</version
>
<!-- Lombok的scope
=provided,说明它只在编译阶段生效,不需要打入包中
-->
<scope>provided
</scope
>
</dependency
>
IEDA添加Lombok插件支持
常用注解
@Data注解在类上,会为类的所有属性自动生成的getting、setting、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Data
public class DataExample {
private final String name
; private int age
;
private double score
;
private String
[] tags
;
}
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。@Getter& @Setter:注解在属性上;为属性提供getting&setting方法
public class GetterSetterExample {
@Getter @Setter private int age
= 10;
@Setter(AccessLevel
.PROTECTED
) private String name
;
@Override public String
toString() {
return String
.format("%s (age: %d)", name
, age
);
}
}
@ToString:类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。 通过将includeFieldNames参数设为true,就能明确的输出toString()属性。这一点是不是有点绕口,通过代码来看会更清晰些。
@ToString(exclude
="id")
public class ToStringExample {
private static final int STATIC_VAR
= 10;
private String name
;
private Shape shape
= new Square(5, 10);
private String
[] tags
;
private int id
;
public String
getName() {
return this.getName();
}
@ToString(callSuper
=true, includeFieldNames
=true)
public static class Square extends Shape {
private final int width
, height
;
public Square(int width
, int height
) {
this.width
= width
;
this.height
= height
;
}
}
}
@EaqusAndHashCode:默认情况下,会使用所有非静态-non-static和非瞬态-non-transient属性来生成equals和hasCode,也能通过@exclude注解来排除一些属性
import lombok
.EqualsAndHashCode
;
@EqualsAndHashCode(exclude
={"id", "shape"})
public class EqualsAndHashCodeExample {
private transient int transientVar
= 10;
private String name
;
private double score
;
private Shape shape
= new Square(5, 10);
private String
[] tags
;
private int id
;
public String
getName() {
return this.name
;
}
@EqualsAndHashCode(callSuper
=true)
public static class Square extends Shape {
private final int width
, height
;
public Square(int width
, int height
) {
this.width
= width
;
this.height
= height
;
}
}
}
@Log4j :注解在类上;为类提供一个 属性名为log的log4j日志对象@NoArgsConstructor 、@RequiredArgsConstructor and @AllArgsConstructor:无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。
@RequiredArgsConstructor(staticName
= "of")
@AllArgsConstructor(access
= AccessLevel
.PROTECTED
)
public class ConstructorExample<T> {
private int x
, y
;
@NonNull private T description
;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field
;
}
}
@Cleanup : 帮助我们自动调用close()方法,可以关闭流
public class CleanupExample {
public static void main(String
[] args
) throws IOException
{
@Cleanup InputStream in
= new FileInputStream(args
[0]);
@Cleanup OutputStream out
= new FileOutputStream(args
[1]);
byte[] b
= new byte[10000];
while (true) {
int r
= in
.read(b
);
if (r
== -1) break;
out
.write(b
, 0, r
);
}
}
}
@Builder : 被注解的类加个构造者模式@Synchronized : 加个同步锁@SneakyThrows : 等同于try/catch 捕获异常@NonNull : 该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
public class NonNullExample extends Something {
private String name
;
public NonNullExample(@NonNull Person person
) {
super("Hello");
this.name
= person
.getName();
}
}
3、总结
Lombok更类似于一种IDE插件变向的说Lombok在改变java语法Lombok是编译时的特性,不是运行时的特性,从语言和技术上讲非必要。改变了如何编写源码相较于IED工具的快捷键只是锦上添花有能力完全阅读Lombok源码的、@Getter& @Setter等一系列被Lombok封装的方法已经烂熟于心,可以变着花样玩的高手可以用!否则不建议用!