Lombok常用注解

常用注解

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</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
  • 源代码
package com.hc.domain;

import lombok.extern.slf4j.Slf4j;

@Slf4j
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(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;
    }
}
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁云亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值