初识Lombok

mac2025-01-26  35

以前的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


本文为学习笔记来源整理自网络,如有侵犯留言联系。 以上内容如有争议、指正,留言给我~

最新回复(0)