以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。
Lombok使用非常简单:
引入相应的Maven包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。
添加IDE工具对Lombok的支持
点击File-- Settings设置界面,安装Lombok插件:
Lombok注解的使用
POJO类常用注解:
1.@Getter/@Setter
用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。
使用注解
生成的getter / setter方法将是public除非您明确指定AccessLevel,如下面的示例所示。AccessLevel
设置逻辑访问级别PUBLIC
,PROTECTED
,PACKAGE
,和PRIVATE
。
- NONE:访问级别手动禁用任何字段的getter/setter生成。这使您可以重写的行为@Getter,@Setter或@Data对类注解。
- PUBLIC:公共级别
- PACKAGE:包级别
- PRIVATE:私有级别
- PROTECTED:受保护级别
package ink.poesy.my.pojo;
import lombok.Data;
import java.sql.Date;
/**
* 使用注解代替手动编写getXXX(),setXXX()
*/
public class User {
private Integer userId;
private String userName;
@Getter(value = AccessLevel.NONE)
private String userPassword;
private @Setter String name;
private Integer age;
private String sex;
private String img;
private Date birthday;
private String tel;
private String email;
private Date created;
private Date updated;
private String show;
}
Structure视图中,可以看到已经生成了getter/setter等方法:
不使用注解
package ink.poesy.my.pojo;
import java.sql.Date;
public class User {
private Integer userId;
private String userName;
private String userPassword;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.@ToString
作用于类,覆盖默认的toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。通过将includeFieldNames参数设为true,就能明确的输出toString()属性:打印时包含每个字段的名称。这一点是不是有点绕口,通过代码来看会更清晰些。
使用注解
import lombok.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;
}
}
}
不使用注解
import java.util.Arrays;
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();
}
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
//使用indludeFieldNames效果
@Override public String toString() {
return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";
}
}
//不使用indludeFieldNames效果
@Override public String toString() {
return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")";
}
}
3.@NonNull
该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
使用注解
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
不使用注解
public class NonNullExample extends Something {
private String name;
public NonNullExample(Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
}
}
4.@Cleanup
该注解能帮助我们自动调用close()方法,很大的简化了代码。
import lombok.Cleanup;
import java.io.*;
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);
}
}
}
不使用注解
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
}
5.@EqualsAndHashCode
默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode,也能通过exclude注解来排除一些属性。
使用注解
@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;
}
}
}
不使用注解
6.@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
作用于类上,用于生成构造函数。有staticName、access等属性。staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor:生成无参构造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;
@AllArgsConstructor:生成全参构造器。
7.@Data
@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
import lombok.AccessLevel;
import lombok.Setter;
import lombok.Data;
import lombok.ToString;
@Data public class DataExample {
private final String name;
@Setter(AccessLevel.PACKAGE) private int age;
private double score;
private String[] tags;
//includeFieldNames参数设为true,能明确的输出属性
@ToString(includeFieldNames=true)
//使用了staticConstructor,生成的构造方法时私有的,正常是public
@Data(staticConstructor="of")
public static class Exercise<T> {
private final String name;
private final T value;
}
}
setAge(int):void是一个圈由上图可知@Data后在内@Setter,起作用的是@Setter
8.还能打印日志@Log
本文为学习笔记来源整理自网络,如有侵犯留言联系。
以上内容如有争议、指正,留言给我~