您当前的位置: 首页 > 

Lombok常用注解

发布时间:2020-04-09 13:11:20 ,浏览量:5

常用注解

Lombok常用的注解有:

  • @Data :相当于@Setter + Getter + @ToString + @EqualsAndHashCode
  • @Setter @Getter:作用于属性上,自动生成getter和setter方法
  • @NonNull:判断是否为空,如果为空,则抛出java.lang.NullPointerException
  • @Synchronized:作用在方法上,自动添加到同步机制,生成的代码并不是直接锁方法而是锁代码块
  • @ToString:生成toString()方法,该注解有以下多个属性可以进一步设置:
    • callSuper:是否输出父类的toString方法,默认为false
    • includeFieldNames:是否包含字段名称,默认为true
    • exclude:排除生成tostring的字段
  • @EqualsAndHashCode
  • @Cleanup:用于确保已分配的资源被释放,自动帮我们调用close()方法。比如IO的连接关闭。
  • @SneakyThrows
  • @NoArgsConstructor:自动生成无参数构造函数。
  • @AllArgsConstructor:自动生成全参数构造函数。
  • @Builder
  • @SuperBuilder
示例 @Getter/@Setter

为字段生成Getter和Setter方法,可以注解到字段或者类上(注解在类上会为类中的所有字段生成Getter和Setter方法),默认是public类型的,如果需要的话可以修改方法的访问级别。

示例一:
  • 源代码
public class Emp { @Getter private Integer empno; @Getter(AccessLevel.PROTECTED) private String ename; @Setter(AccessLevel.PRIVATE) private String job; @Getter @Setter private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public Integer getEmpno() { return this.empno; } protected String getEname() { return this.ename; } private void setJob(String job) { this.job = job; } public Integer getMgr() { return this.mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } } 

注意:Lombok中的注解一般都会包含一个无参构造函数注解@NoArgsConstructor(用于生成无参构造函数的) ,所以还会额外生成一个无参构造函数

示例二:@Getter @Setter 注解在类上,表示为类中的所有字段生成Getter&Setter方法。
  • 源代码
@Getter @Setter public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成的代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public static void main(String[] args) { System.out.println(5); } public Integer getEmpno() { return this.empno; } public String getEname() { return this.ename; } public String getJob() { return this.job; } public Integer getMgr() { return this.mgr; } public LocalDate getHiredate() { return this.hiredate; } public void setEmpno(Integer empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setMgr(Integer mgr) { this.mgr = mgr; } } 
@NonNull

生成setter方法时会参数是否为空检查 为字段赋值时(即调用字段的setter方法时),如果传的参数为null,则会抛出空异常NullPointerException

  • 源代码
@Getter @Setter public class Emp { @NonNull private Integer empno; private String ename; } 
  • 生成的代码
public class Emp { @NonNull private Integer empno; private String ename; public Emp() { } @NonNull public Integer getEmpno() { return this.empno; } public void setEmpno(@NonNull Integer empno) { if (empno == null) { throw new NullPointerException("empno is marked non-null but is null"); } else { this.empno = empno; } } public String getEname() { return this.ename; } public void setEname(String ename) { this.ename = ename; } } 
@NoArgsConstructor

生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null, 这样编译器就不会报错。 对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

final字段未初始化编译器报错:

在这里插入图片描述

  • 源代码
@Setter @NoArgsConstructor(force = true) public class Emp { @NonNull private Integer empno; private final String ename; } 
  • 生成的代码
public class Emp { @NonNull private Integer empno; private final String ename = null; public static void main(String[] args) { System.out.println(5); } public void setEmpno(@NonNull Integer empno) { if (empno == null) { throw new NullPointerException("empno is marked non-null but is null"); } else { this.empno = empno; } } public Emp() { } } 
@RequiredArgsConstructor

生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。 @RequiredArgsConstructor(staticName = “of”)会生成一个of()的静态方法,并把构造方法设置为私有的

示例一:生成不带参数的构造方法
  • 源代码
@RequiredArgsConstructor public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public static void main(String[] args) { System.out.println(5); } public Emp() { } } 
示例二:参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。
  • 源代码
@RequiredArgsConstructor public class Emp { @NotNull private Integer empno; @NotNull private String ename = "zhangsan"; private final String job; private final Integer mgr =1234; private LocalDate hiredate; } 
  • 生成的代码
public class Emp { @NotNull private Integer empno; @NotNull private String ename; private final String job; private final Integer mgr; private LocalDate hiredate; public Emp(@NotNull Integer empno, String job) { if (empno == null) { $$$reportNull$$$0(0); } super(); this.ename = "zhangsan"; this.mgr = 1234; if (empno == null) { throw new NullPointerException("empno is marked non-null but is null"); } else { this.empno = empno; this.job = job; } } } 
示例三:生成一个of()的静态方法,并把构造方法设置为私有的
  • 源代码
@RequiredArgsConstructor( staticName = "of") public class Emp { @NotNull private Integer empno; @NotNull private String ename = "zhangsan"; private final String job; private final Integer mgr =1234; private LocalDate hiredate; } 
  • 生成代码
public class Emp { @NotNull private Integer empno; @NotNull private String ename; private final String job; private final Integer mgr; private LocalDate hiredate; private Emp(@NotNull Integer empno, String job) { if (empno == null) { $$$reportNull$$$0(0); } super(); this.ename = "zhangsan"; this.mgr = 1234; if (empno == null) { throw new NullPointerException("empno is marked non-null but is null"); } else { this.empno = empno; this.job = job; } } public static Emp of(@NotNull Integer empno, String job) { if (empno == null) { $$$reportNull$$$0(1); } return new Emp(empno, job); } } 
@AllArgsConstructor

生成一个全参数的构造方法

示例一
  • 源代码
@AllArgsConstructor public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) { this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; } } 
示例二
  • 源代码
@AllArgsConstructor public class Emp { @NotNull private Integer empno; @NotNull private String ename = "zhangsan"; private final String job; private final Integer mgr =1234; //不会出现在生成的构造方法中 private LocalDate hiredate; } 
  • 生成代码
public class Emp { @NotNull private Integer empno; @NotNull private String ename; private final String job; private final Integer mgr; private LocalDate hiredate; public Emp(@NotNull Integer empno, @NotNull String ename, String job, LocalDate hiredate) { if (empno == null) { $$$reportNull$$$0(0); } if (ename == null) { $$$reportNull$$$0(1); } super(); this.ename = "zhangsan"; this.mgr = 1234; if (empno == null) { throw new NullPointerException("empno is marked non-null but is null"); } else if (ename == null) { throw new NullPointerException("ename is marked non-null but is null"); } else { this.empno = empno; this.ename = ename; this.job = job; this.hiredate = hiredate; } } } 
构造方法综合示例:

如果要同时生成默认构造方法、指定参数构造方法、全参构造方法,可以采用Lombok自动生成无参和全参的构造方法,然后手工添加指定参数的构造方法

  • 源代码
@NoArgsConstructor @AllArgsConstructor public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; //手工生成指定参数的构造方法 public Emp(Integer empno, String ename, String job) { this.empno = empno; this.ename = ename; this.job = job; } } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp(Integer empno, String ename, String job) { this.empno = empno; this.ename = ename; this.job = job; } public Emp() { } public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) { this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; } } 
@ToString

生成toString()方法,默认情况下它会按顺序(以逗号分隔)打印你的类名称以及每个字段。 还可以设置不包含哪些字段,可以指定一个也可以指定多个@ToString(exclude = “id”) / @ToString(exclude = {“id”,“name”})

如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)

示例一:
  • 源代码
@ToString public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public String toString() { return "Emp(empno=" + this.empno + ", ename=" + this.ename + ", job=" + this.job + ", mgr=" + this.mgr + ", hiredate=" + this.hiredate + ")"; } } 
示例二:
  • 源代码
@ToString(exclude = {"hiredate","job"}) public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public String toString() { return "Emp(empno=" + this.empno + ", ename=" + this.ename + ", mgr=" + this.mgr + ")"; } } 
示例三:
  • 源代码
@ToString(exclude = {"hiredate","job"},callSuper = true) public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public static void main(String[] args) { System.out.println(3 + 2); } } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public static void main(String[] args) { System.out.println(5); } public String toString() { return "Emp(super=" + super.toString() + ", empno=" + this.empno + ", ename=" + this.ename + ", mgr=" + this.mgr + ")"; } } 
@EqualsAndHashCode

生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在of参数中命名它们来准确指定希望使用哪些字段。

示例一:
  • 源代码
@EqualsAndHashCode public class Emp { private Integer empno; private String ename; private static String job; private Integer mgr; private transient LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private static String job; private Integer mgr; private transient LocalDate hiredate; public Emp() { } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; if (!other.canEqual(this)) { return false; } else { label47: { Object this$empno = this.empno; Object other$empno = other.empno; if (this$empno == null) { if (other$empno == null) { break label47; } } else if (this$empno.equals(other$empno)) { break label47; } return false; } Object this$ename = this.ename; Object other$ename = other.ename; if (this$ename == null) { if (other$ename != null) { return false; } } else if (!this$ename.equals(other$ename)) { return false; } Object this$mgr = this.mgr; Object other$mgr = other.mgr; if (this$mgr == null) { if (other$mgr != null) { return false; } } else if (!this$mgr.equals(other$mgr)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Emp; } public int hashCode() { int PRIME = true; int result = 1; Object $empno = this.empno; int result = result * 59 + ($empno == null ? 43 : $empno.hashCode()); Object $ename = this.ename; result = result * 59 + ($ename == null ? 43 : $ename.hashCode()); Object $mgr = this.mgr; result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode()); return result; } } 
示例二:exclude 排除字段
  • 源代码
@EqualsAndHashCode(exclude = {"mgr","hiredate"}) public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; if (!other.canEqual(this)) { return false; } else { label47: { Object this$empno = this.empno; Object other$empno = other.empno; if (this$empno == null) { if (other$empno == null) { break label47; } } else if (this$empno.equals(other$empno)) { break label47; } return false; } Object this$ename = this.ename; Object other$ename = other.ename; if (this$ename == null) { if (other$ename != null) { return false; } } else if (!this$ename.equals(other$ename)) { return false; } Object this$job = this.job; Object other$job = other.job; if (this$job == null) { if (other$job != null) { return false; } } else if (!this$job.equals(other$job)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Emp; } public int hashCode() { int PRIME = true; int result = 1; Object $empno = this.empno; int result = result * 59 + ($empno == null ? 43 : $empno.hashCode()); Object $ename = this.ename; result = result * 59 + ($ename == null ? 43 : $ename.hashCode()); Object $job = this.job; result = result * 59 + ($job == null ? 43 : $job.hashCode()); return result; } } 
示例一:of 指定要包含的字段
  • 源代码
@EqualsAndHashCode(of = {"mgr","hiredate"}) public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public static void main(String[] args) { System.out.println(5); } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; if (!other.canEqual(this)) { return false; } else { Object this$mgr = this.mgr; Object other$mgr = other.mgr; if (this$mgr == null) { if (other$mgr != null) { return false; } } else if (!this$mgr.equals(other$mgr)) { return false; } Object this$hiredate = this.hiredate; Object other$hiredate = other.hiredate; if (this$hiredate == null) { if (other$hiredate != null) { return false; } } else if (!this$hiredate.equals(other$hiredate)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Emp; } public int hashCode() { int PRIME = true; int result = 1; Object $mgr = this.mgr; int result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode()); Object $hiredate = this.hiredate; result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode()); return result; } } 
@Data

@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能

示例:
  • 源代码
@Data public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; public Emp() { } public Integer getEmpno() { return this.empno; } public String getEname() { return this.ename; } public String getJob() { return this.job; } public Integer getMgr() { return this.mgr; } public LocalDate getHiredate() { return this.hiredate; } public void setEmpno(Integer empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setMgr(Integer mgr) { this.mgr = mgr; } public void setHiredate(LocalDate hiredate) { this.hiredate = hiredate; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; if (!other.canEqual(this)) { return false; } else { label71: { Object this$empno = this.getEmpno(); Object other$empno = other.getEmpno(); if (this$empno == null) { if (other$empno == null) { break label71; } } else if (this$empno.equals(other$empno)) { break label71; } return false; } Object this$ename = this.getEname(); Object other$ename = other.getEname(); if (this$ename == null) { if (other$ename != null) { return false; } } else if (!this$ename.equals(other$ename)) { return false; } label57: { Object this$job = this.getJob(); Object other$job = other.getJob(); if (this$job == null) { if (other$job == null) { break label57; } } else if (this$job.equals(other$job)) { break label57; } return false; } Object this$mgr = this.getMgr(); Object other$mgr = other.getMgr(); if (this$mgr == null) { if (other$mgr != null) { return false; } } else if (!this$mgr.equals(other$mgr)) { return false; } Object this$hiredate = this.getHiredate(); Object other$hiredate = other.getHiredate(); if (this$hiredate == null) { if (other$hiredate == null) { return true; } } else if (this$hiredate.equals(other$hiredate)) { return true; } return false; } } } protected boolean canEqual(Object other) { return other instanceof Emp; } public int hashCode() { int PRIME = true; int result = 1; Object $empno = this.getEmpno(); int result = result * 59 + ($empno == null ? 43 : $empno.hashCode()); Object $ename = this.getEname(); result = result * 59 + ($ename == null ? 43 : $ename.hashCode()); Object $job = this.getJob(); result = result * 59 + ($job == null ? 43 : $job.hashCode()); Object $mgr = this.getMgr(); result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode()); Object $hiredate = this.getHiredate(); result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode()); return result; } public String toString() { return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ")"; } } 
@Value

@Value 将字段都变成不可变类型:使用final修饰, 同时还包含@ToString、@EqualsAndHashCode、@AllArgsConstructor 、@Getter(注意只有Getter没有Setter)

示例:
  • 源代码
@Value public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; } 
  • 生成代码
public final class Emp { private final Integer empno; private final String ename; private final String job; private final Integer mgr; private final LocalDate hiredate; public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) { this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; } public Integer getEmpno() { return this.empno; } public String getEname() { return this.ename; } public String getJob() { return this.job; } public Integer getMgr() { return this.mgr; } public LocalDate getHiredate() { return this.hiredate; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; Object this$empno = this.getEmpno(); Object other$empno = other.getEmpno(); if (this$empno == null) { if (other$empno != null) { return false; } } else if (!this$empno.equals(other$empno)) { return false; } label61: { Object this$ename = this.getEname(); Object other$ename = other.getEname(); if (this$ename == null) { if (other$ename == null) { break label61; } } else if (this$ename.equals(other$ename)) { break label61; } return false; } label54: { Object this$job = this.getJob(); Object other$job = other.getJob(); if (this$job == null) { if (other$job == null) { break label54; } } else if (this$job.equals(other$job)) { break label54; } return false; } Object this$mgr = this.getMgr(); Object other$mgr = other.getMgr(); if (this$mgr == null) { if (other$mgr != null) { return false; } } else if (!this$mgr.equals(other$mgr)) { return false; } Object this$hiredate = this.getHiredate(); Object other$hiredate = other.getHiredate(); if (this$hiredate == null) { if (other$hiredate != null) { return false; } } else if (!this$hiredate.equals(other$hiredate)) { return false; } return true; } } public int hashCode() { int PRIME = true; int result = 1; Object $empno = this.getEmpno(); int result = result * 59 + ($empno == null ? 43 : $empno.hashCode()); Object $ename = this.getEname(); result = result * 59 + ($ename == null ? 43 : $ename.hashCode()); Object $job = this.getJob(); result = result * 59 + ($job == null ? 43 : $job.hashCode()); Object $mgr = this.getMgr(); result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode()); Object $hiredate = this.getHiredate(); result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode()); return result; } public String toString() { return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ")"; } } 
@Log

生成log对象,用于记录日志,可以通过topic属性来设置getLogger(String name)方法的参数 例如 @Log4j(topic = “com.xxx.entity.User”),默认是类的全限定名,即 类名.class,log支持以下几种:

  • @Log java.util.logging.Logger
  • @Log4j org.apache.log4j.Logger
  • @Log4j2 org.apache.logging.log4j.Logger
  • @Slf4j org.slf4j.Logger
  • @XSlf4j org.slf4j.ext.XLogger
  • @CommonsLog org.apache.commons.logging.Log
  • @JBossLog org.jboss.logging.Logger
示例一:
  • Maven依赖
<dependency> <groupId>org.slf4j public static void main(String[] args) { log.info("info","hahaa"); } } 
  • 生成代码
package com.hc.domain; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Emp { private static final Logger log = LoggerFactory.getLogger(Emp.class); public Emp() { } public static void main(String[] args) { log.info("info", "hahaa"); } } 

结果: 在这里插入图片描述

示例二:
  • 源代码
package com.hc.domain; import lombok.extern.slf4j.Slf4j; @Slf4j(topic = "com.hc.demo") public class Emp { public static void main(String[] args) { log.info("info","hahaa"); } } 
  • 生成代码
package com.hc.domain; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Emp { private static final Logger log = LoggerFactory.getLogger("com.hc.demo"); public Emp() { } public static void main(String[] args) { log.info("info", "hahaa"); } } 
  • 结果 在这里插入图片描述
@SneakyThrows 示例:
  • 源代码
public class LombokDemo { @SneakyThrows public void fun1(){ Thread.sleep(1000); } @SneakyThrows(InterruptedException.class) public void fun2(){ Thread.sleep(1000); } } 
  • 生成代码
public class LombokDemo { public LombokDemo() { } public void fun1() { try { Thread.sleep(1000L); } catch (Throwable var2) { throw var2; } } public void fun2() { try { Thread.sleep(1000L); } catch (InterruptedException var2) { throw var2; } } } 
@Synchronized:给方法加上同步锁 示例:
  • 源代码
public class LombokDemo { @Synchronized public void fun1() { System.out.println("fun1"); } private final Object readLock = new Object(); @Synchronized("readLock") public void fun2() { System.out.println("fun1"); } @Synchronized public static void fun3() { System.out.println("fun1"); } } 
  • 生成代码
public class LombokDemo { private final Object $lock = new Object[0]; private static final Object $LOCK = new Object[0]; private final Object readLock = new Object(); public LombokDemo() { } public void fun1() { synchronized(this.$lock) { System.out.println("fun1"); } } public void fun2() { synchronized(this.readLock) { System.out.println("fun1"); } } public static void fun3() { synchronized($LOCK) { System.out.println("fun1"); } } } 
Cleanup

主要用来修饰 IO 流相关类, 会在 finally 代码块中对该资源进行 close();

示例一:
  • 源代码
public class LombokDemo { public static void fileCopy(File sources, File aim) throws IOException {// psvm @Cleanup FileInputStream fis = new FileInputStream(sources); @Cleanup FileOutputStream fos = new FileOutputStream(aim); byte[] buf = new byte[256]; int len = -1; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } } } 
  • 生成代码
public class LombokDemo { public LombokDemo() { } public static void fileCopy(File sources, File aim) throws IOException { FileInputStream fis = new FileInputStream(sources); try { FileOutputStream fos = new FileOutputStream(aim); try { byte[] buf = new byte[256]; boolean var5 = true; int len; while((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } } finally { if (Collections.singletonList(fos).get(0) != null) { fos.close(); } } } finally { if (Collections.singletonList(fis).get(0) != null) { fis.close(); } } } } 
@Getter(lazy = true)

标注字段为懒加载字段,懒加载字段在创建对象时不会进行初始化,而是在第一次访问的时候才会初始化,后面再次访问也不会重复初始化

对照代码
public class LombokDemo { private final List<String> list = getListFromCache(); private List<String> getListFromCache() { System.out.println("getListFromCache"); return new ArrayList<>(); } public static void main(String[] args) { LombokDemo lombokDemo = new LombokDemo(); System.out.println("-----------"); System.out::println(lombokDemo.list); } } 

运行main方法,初始化对象LombokDemo时,会调用getListFromCache()方法,如下图所示: 在这里插入图片描述

  • 源代码
public class LombokDemo { @Getter(lazy = true) private final List<String> list = getListFromCache(); private List<String> getListFromCache() { System.out.println("getListFromCache"); return new ArrayList<>(); } public static void main(String[] args) { LombokDemo lombokDemo = new LombokDemo(); System.out.println("-----------"); lombokDemo.getList(); // 使用注解 @Getter(lazy = true)后会生成这样一个getter方法 } } 
  • 生成代码
public class LombokDemo { private final AtomicReference<Object> list = new AtomicReference(); public LombokDemo() { } private List<String> getListFromCache() { System.out.println("getListFromCache"); return new ArrayList(); } public static void main(String[] args) { LombokDemo lombokDemo = new LombokDemo(); System.out.println("-----------"); lombokDemo.getList(); } public List<String> getList() { Object value = this.list.get(); if (value == null) { synchronized(this.list) { value = this.list.get(); if (value == null) { List<String> actualValue = this.getListFromCache(); value = actualValue == null ? this.list : actualValue; this.list.set(value); } } } return (List)((List)(value == this.list ? null : value)); } } 
@Delegate

为List类型的字段生成一大堆常用的方法,其实这些方法都是List中的方法

  • 源代码
public class LombokDemo { @Delegate private List<String> list ; } 
  • 生成代码
public class LombokDemo { private List<String> list; public LombokDemo() { } public static void main(String[] args) { } public int size() { return this.list.size(); } public boolean isEmpty() { return this.list.isEmpty(); } public boolean contains(Object arg0) { return this.list.contains(arg0); } public Iterator<String> iterator() { return this.list.iterator(); } public Object[] toArray() { return this.list.toArray(); } public <T> T[] toArray(T[] arg0) { return this.list.toArray(arg0); } public boolean add(String arg0) { return this.list.add(arg0); } public boolean remove(Object arg0) { return this.list.remove(arg0); } public boolean containsAll(Collection<?> arg0) { return this.list.containsAll(arg0); } public boolean addAll(Collection<? extends String> arg0) { return this.list.addAll(arg0); } public boolean addAll(int arg0, Collection<? extends String> arg1) { return this.list.addAll(arg0, arg1); } public boolean removeAll(Collection<?> arg0) { return this.list.removeAll(arg0); } public boolean retainAll(Collection<?> arg0) { return this.list.retainAll(arg0); } public void replaceAll(UnaryOperator<String> arg0) { this.list.replaceAll(arg0); } public void sort(Comparator<? super String> arg0) { this.list.sort(arg0); } public void clear() { this.list.clear(); } public String get(int arg0) { return (String)this.list.get(arg0); } public String set(int arg0, String arg1) { return (String)this.list.set(arg0, arg1); } public void add(int arg0, String arg1) { this.list.add(arg0, arg1); } public String remove(int arg0) { return (String)this.list.remove(arg0); } public int indexOf(Object arg0) { return this.list.indexOf(arg0); } public int lastIndexOf(Object arg0) { return this.list.lastIndexOf(arg0); } public ListIterator<String> listIterator() { return this.list.listIterator(); } public ListIterator<String> listIterator(int arg0) { return this.list.listIterator(arg0); } public List<String> subList(int arg0, int arg1) { return this.list.subList(arg0, arg1); } public Spliterator<String> spliterator() { return this.list.spliterator(); } } 

注意:一个类中只能使用一个@Delegate注解,因为使用多个会生成多个size()方法,从而会编译报错。

综合示例
  • 源代码
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; /**
 * 员工
 *
 * @author HC
 */ @Data @ToString @NoArgsConstructor @AllArgsConstructor public class Emp { /**
     * 员工编号
     */ private Integer empno; /**
     * 员工姓名
     */ private String ename; /**
     * 工作
     */ private String job; /**
     * 上级领导编号
     */ private Integer mgr; /**
     * 受雇日期
     */ private LocalDate hiredate; /**
     * 薪资
     */ private Double sal; /**
     * 奖金
     */ private Double comm; /**
     * 部门编号
     */ private Integer deptno; @Synchronized public void cleanUp() { try { @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write(new byte[] {'a','b','c'}); System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); } } } 
  • 生成的代码
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; import java.util.Collections; public class Emp { private final Object $lock = new Object[0]; private Integer empno; private String ename; private String job; private Integer mgr; private LocalDate hiredate; private Double sal; private Double comm; private Integer deptno; public void cleanUp() { synchronized(this.$lock) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { baos.write(new byte[]{97, 98, 99}); System.out.println(baos.toString()); } finally { if (Collections.singletonList(baos).get(0) != null) { baos.close(); } } } catch (IOException var9) { var9.printStackTrace(); } } } public Integer getEmpno() { return this.empno; } public String getEname() { return this.ename; } public String getJob() { return this.job; } public Integer getMgr() { return this.mgr; } public LocalDate getHiredate() { return this.hiredate; } public Double getSal() { return this.sal; } public Double getComm() { return this.comm; } public Integer getDeptno() { return this.deptno; } public void setEmpno(final Integer empno) { this.empno = empno; } public void setEname(final String ename) { this.ename = ename; } public void setJob(final String job) { this.job = job; } public void setMgr(final Integer mgr) { this.mgr = mgr; } public void setHiredate(final LocalDate hiredate) { this.hiredate = hiredate; } public void setSal(final Double sal) { this.sal = sal; } public void setComm(final Double comm) { this.comm = comm; } public void setDeptno(final Integer deptno) { this.deptno = deptno; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof Emp)) { return false; } else { Emp other = (Emp)o; if (!other.canEqual(this)) { return false; } else { label107: { Object this$empno = this.getEmpno(); Object other$empno = other.getEmpno(); if (this$empno == null) { if (other$empno == null) { break label107; } } else if (this$empno.equals(other$empno)) { break label107; } return false; } Object this$ename = this.getEname(); Object other$ename = other.getEname(); if (this$ename == null) { if (other$ename != null) { return false; } } else if (!this$ename.equals(other$ename)) { return false; } Object this$job = this.getJob(); Object other$job = other.getJob(); if (this$job == null) { if (other$job != null) { return false; } } else if (!this$job.equals(other$job)) { return false; } label86: { Object this$mgr = this.getMgr(); Object other$mgr = other.getMgr(); if (this$mgr == null) { if (other$mgr == null) { break label86; } } else if (this$mgr.equals(other$mgr)) { break label86; } return false; } label79: { Object this$hiredate = this.getHiredate(); Object other$hiredate = other.getHiredate(); if (this$hiredate == null) { if (other$hiredate == null) { break label79; } } else if (this$hiredate.equals(other$hiredate)) { break label79; } return false; } label72: { Object this$sal = this.getSal(); Object other$sal = other.getSal(); if (this$sal == null) { if (other$sal == null) { break label72; } } else if (this$sal.equals(other$sal)) { break label72; } return false; } Object this$comm = this.getComm(); Object other$comm = other.getComm(); if (this$comm == null) { if (other$comm != null) { return false; } } else if (!this$comm.equals(other$comm)) { return false; } Object this$deptno = this.getDeptno(); Object other$deptno = other.getDeptno(); if (this$deptno == null) { if (other$deptno != null) { return false; } } else if (!this$deptno.equals(other$deptno)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof Emp; } public int hashCode() { int PRIME = true; int result = 1; Object $empno = this.getEmpno(); int result = result * 59 + ($empno == null ? 43 : $empno.hashCode()); Object $ename = this.getEname(); result = result * 59 + ($ename == null ? 43 : $ename.hashCode()); Object $job = this.getJob(); result = result * 59 + ($job == null ? 43 : $job.hashCode()); Object $mgr = this.getMgr(); result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode()); Object $hiredate = this.getHiredate(); result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode()); Object $sal = this.getSal(); result = result * 59 + ($sal == null ? 43 : $sal.hashCode()); Object $comm = this.getComm(); result = result * 59 + ($comm == null ? 43 : $comm.hashCode()); Object $deptno = this.getDeptno(); result = result * 59 + ($deptno == null ? 43 : $deptno.hashCode()); return result; } public String toString() { return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ", sal=" + this.getSal() + ", comm=" + this.getComm() + ", deptno=" + this.getDeptno() + ")"; } public Emp() { } public Emp(final Integer empno, final String ename, final String job, final Integer mgr, final LocalDate hiredate, final Double sal, final Double comm, final Integer deptno) { this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.deptno = deptno; } } 
关注
打赏
1688896170
查看更多评论

暂无认证

  • 5浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1252s