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
封装的方法已经烂熟于心,可以变着花样玩的高手可以用!否则不建议用!