Lombok注解

574 阅读4分钟

@NonNull

作用:判断是否为空,为空自动抛出空指针异常。

标注点:方法或者构造器的参数上。

示例:

import lombok.NonNull;


public class NonNullExample extends Something {

  private String name;

  public NonNullExample(@NonNull Person person) {
    this.name = person.getName();
  }
}

编译后为

import lombok.NonNull;


public class NonNullExample extends Something {

  private String name;

  public NonNullExample(@NonNull Person person) {
    if (person == null) {
      throw new NullPointerException("person is marked @NonNull but is null");
    }

    this.name = person.getName();

  }

}

@Getter和@Setter

作用:用于自动生成get、set方法。Boolean类型为is开头。

标注点:字段或者类上面。作用类上面自动生成非静态字段的get和set方法。

@ToString

作用:用于生成toString()方法。

配置项:

  • includeFieldNames,默认为true,表示在toString输出时输出字段名称。

  • callSuper,默认为false,表示生成toString时不输出超类中的字段内容,若要输出超类中的内容,需要设置为true

  • doNotUseGetters,默认为false,表示获取字段值时通过get方法获取,设置为true表示直接通过字段获取

  • onlyExplicitlyIncluded,默认为false,表示输出所有非静态字段内容,如果设置为true,则只输出标注有@ToString.Include的字段和方法。

标注点:类上面

示例:

import lombok.ToString;

  
@ToString

public class ToStringExample {

  private static final int STATIC_VAR = 10;

  private String name;

  private Shape shape = new Square(5, 10);

  private String[] tags;

  @ToString.Exclude 
  private int id;

  public String getName() {
    return this.name;
  }

 

  @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.name;
  }

  public static class Square extends Shape {

    private final int width, height;

    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
    

    @Override 
    public String toString() {

      return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";

    }

  }

  @Override 
  public String toString() {
    return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")";
  }

}

@ToString.Include

作用:toString方法会默认忽略掉命名为$开头的变量。该注解表示生成toString方法时包含该注解标注的字段和方法,需要与onlyExplicitlyIncluded一起使用。

标注点:字段或者方法。方法是无参、非静态类型。

@ToString.Exclude

作用:表示生成toString方法时不包含被该注解标注的字段。那么生成toString方法时会跳过这些字段,

标注点:字段。

@EqualsAndHashCode

作用:生成hastcode和equals方法

配置项:

  • callSuper,默认为false,表示生成toString时不输出超类中的字段内容,若要输出超类中的内容,需要设置为true

  • doNotUseGetters,默认为false,表示获取字段值时通过get方法获取,设置为true表示直接通过字段获取

标注点:类

示例


import lombok.EqualsAndHashCode;


@EqualsAndHashCode

public class EqualsAndHashCodeExample {

  private transient int transientVar = 10;

  private String name;

  private double score;

  @EqualsAndHashCode.Exclude private Shape shape = new Square(5, 10);

  private String[] tags;

  @EqualsAndHashCode.Exclude 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;

    }

  }

}

编译后

import java.util.Arrays;


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;

  }

 

  @Override public boolean equals(Object o) {

    if (o == this) return true;

    if (!(o instanceof EqualsAndHashCodeExample)) return false;

    EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;

    if (!other.canEqual((Object)this)) return false;

    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;

    if (Double.compare(this.score, other.score) != 0) return false;

    if (!Arrays.deepEquals(this.tags, other.tags)) return false;

    return true;

  }

 

  @Override public int hashCode() {

    final int PRIME = 59;

    int result = 1;

    final long temp1 = Double.doubleToLongBits(this.score);

    result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode());

    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));

    result = (result*PRIME) + Arrays.deepHashCode(this.tags);

    return result;

  }

 

  protected boolean canEqual(Object other) {

    return other instanceof EqualsAndHashCodeExample;

  }

 

  public static class Square extends Shape {

    private final int width, height;

   

    public Square(int width, int height) {

      this.width = width;

      this.height = height;

    }

   

    @Override public boolean equals(Object o) {

      if (o == this) return true;

      if (!(o instanceof Square)) return false;

      Square other = (Square) o;

      if (!other.canEqual((Object)this)) return false;

      if (!super.equals(o)) return false;

      if (this.width != other.width) return false;

      if (this.height != other.height) return false;

      return true;

    }

   

    @Override public int hashCode() {

      final int PRIME = 59;

      int result = 1;

      result = (result*PRIME) + super.hashCode();

      result = (result*PRIME) + this.width;

      result = (result*PRIME) + this.height;

      return result;

    }

   

    protected boolean canEqual(Object other) {

      return other instanceof Square;

    }

  }

}

@EqualsAndHashCode.Include

作用:需要与onlyExplicitlyIncluded配合使用,表示将该注解标注的内容添加到实现hashCode和equals方法的内容中去。

标注点:字段或者方法之上,

@EqualsAndHashCode.Exclude

作用:用于排除不需要参与生成hashCode和equals方法的字段。可单独使用。

标注点:字段。

@NoArgsConstructor, @RequiredArgsConstructor,@AllArgsConstructor

@NoArgsConstructor

作用:用于生成无参构造器,如果类中存在final字段,则会报编译错误。一般结合其他几个构造器注解一起使用提供一个无参构造器,并且不会检查@NonNull标注的字段。

标注点:类。

@AllArgsConstructor

作用:用于生成包含所有字段的构造器。@NonNull字段会进行null判断检查。

标注点:类

@RequiredArgsConstructor

作用:生成单参数的构造器。包含final字段和类似于@NonNull约束标注的字段,会对@NonNull字段进行明确的null检查。

标注点:类

@Data

作用:@ToString,@EqualsAndHashCode、@Getter、@Setter、@RequiredArgsConstructor综合体。开发中此注解用得比较多。

标注点:类

@Builder

作用:建造者模式生成对象;开发中此注解比较常用。

标注点:常见于类上,也可方法和构造器;

参考:

[1]. projectlombok.org/features/al…