Skip to content

@Getter and @Setter

YellowStar5 edited this page Aug 8, 2019 · 3 revisions

@Getter and @Setter

再也不用写 public int getFoo() {return foo;}了。

概览

你可以使用 @Getter 和/或 @Setter 注释任何字段,让lombok自动生成默认的getter/setter。

默认的getter只返回字段,如果字段名为fooisFoo,如果字段的类型为boolean),则getter命名为 getFoo()。如果字段名为foo,默认的setter名为setFoo,返回void,并且该字段采用与该字段相同类型的1个参数。它只是将字段设置为参数值。

除非您明确指定 AccessLevel,否则生成的 getter/setter 方法将是 public 的,如下面的示例所示。合法访问级别为PUBLICPROTECTEDPACKAGEPRIVATE

你还可以在类上放置 @Getter 和/或 @Setter 注解。在这种情况下,就像使用该注解注释了该类中的所有非静态字段一样。

你始终可以使用特殊的 AccessLevel.NONE 访问级别手动禁用任何字段的 getter/setter 生成。这使您可以覆盖类上 @Getter@Setter@Data 注解的行为。

要在生成的方法上添加注解,可以使用 onMethod=@__({@AnnotationsHere}); 要将注解放在生成的setter方法的唯一参数上,可以使用onParam=@__({@AnnotationsHere})。但要小心!这是一个实验性功能。有关更多详细信息,请参阅有关onX功能的文档。

lombok v1.12.0中的新功能:现在将字段上的 javadoc 复制到生成的 getter 和 setter。通常,所有文本都被复制,@return 被移动到getter,而 @param 被移动到 setter。已移动表示:从字段的javadoc中删除。也可以为每个 getter/setter 定义唯一的文本。为此,你可以创建名为 GETTER 和/或 SETTER 的“section”。一个section是你的javadoc一行中包含2个或更多短划线,然后是文本GETTERSETTER,后面跟着2个或更多的短划线,行上没有其他内容。如果使用section,则不再执行 @return@param 部分的移动(将 @return@param 行移动到指定的section中)。

With Lombok

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class GetterSetterExample {
  /**
   * Age of the person. Water is wet.
   * 
   * @param age New value for this person's age. Sky is blue.
   * @return The current value of this person's age. Circles are round.
   */
  @Getter @Setter private int age = 10;
  
  /**
   * Name of the person.
   * -- SETTER --
   * Changes the name of this person.
   * 
   * @param name The new value.
   */
  @Setter(AccessLevel.PROTECTED) private String name;
  
  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }
}

等价的Java

 public class GetterSetterExample {
  /**
   * Age of the person. Water is wet.
   */
  private int age = 10;

  /**
   * Name of the person.
   */
  private String name;
  
  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }
  
  /**
   * Age of the person. Water is wet.
   *
   * @return The current value of this person's age. Circles are round.
   */
  public int getAge() {
    return age;
  }
  
  /**
   * Age of the person. Water is wet.
   *
   * @param age New value for this person's age. Sky is blue.
   */
  public void setAge(int age) {
    this.age = age;
  }
  
  /**
   * Changes the name of this person.
   *
   * @param name The new value.
   */
  protected void setName(String name) {
    this.name = name;
  }
}

支持的配置键

lombok.accessors.chain = [ true | false](默认值:false)

如果设置为 true,则生成的setter将返回 this(而不是 void)。 @Accessors 注解的显式配置的 chain 参数优先于此设置。

lombok.accessors.fluent = [ true | false](默认值:false)

如果设置为true,则生成的getter和setter不会以bean标准 getisset 为前缀;相反,这些方法将使用与字段相同的名称(减去getisset前缀)。 @Accessors 注解的显式配置的 chain 参数优先于此设置。

lombok.accessors.prefix +=字段前缀(默认值:空列表)

这是一个列表属性;可以使用+=运算符添加条目。可以使用-=运算符删除父配置文件中的继承前缀。 Lombok将从字段名称中删除任何匹配的字段前缀,以确定要生成的 getter/setter 的名称。例如,如果 m 是此设置中列出的前缀之一,则名为 mFoobar 的字段将生成名为 getFoobar() 的getter,而不是 getMFoobar()@Accessors 注解的显式配置的 chain 参数优先于此设置。

lombok.getter.noIsPrefix = [ true | false](默认值:false)

如果设置为 true,则为布尔字段生成的 getter 将使用 get 前缀而不是默认的 is 前缀,并且任何调用 getter 的生成代码, 如@ToString, 也将使用 get 而不是 is

lombok.setter.flagUsage = [ warning | error ](默认:未设置)

如果已配置,Lombok会将 @Setter 的任何用法标记为警告或错误。

lombok.getter.flagUsage = [ warning| error ](默认:未设置)

如果已配置,Lombok会将 @Getter 的任何用法标记为警告或错误。

lombok.copyableAnnotations = [完全限定类型列表](默认值:空列表)

Lombok会将任何这些注解从字段复制到setter参数和getter方法。请注意,lombok附带了一堆“开箱即用”的注解,这些注解已知是可复制的:所有流行的可空/非空注解。

Small Print

为了生成方法名称,字段的第一个字符(如果是小写字符)是大写该字符,否则,该字符保持不变。然后,添加get/set/is作为前缀。

如果已存在具有相同名称(不区分大小写)和相同个数参数的任何方法,则不会生成任何方法。例如,如果已经有方法 getFoo(String... x),则不会生成 getFoo(),即使在技术上可以生成该方法。如果由于为了防止混淆而跳过了方法的生成,则会发出警告。 Varargs计为0到N个参数。您可以使用 @lombok.experimental.Tolerate 标记任何方法将其隐藏在lombok中。

对于以 is 开头且后面紧跟着大写字母的布尔字段,不会添加任何前缀来生成getter名称。

布尔值的任何变化都不会导致使用 is 前缀,而不使用 get 前缀;例如,返回java.lang.Boolean 会产生 get 前缀,而不是 is前缀。

来自流行库的表示非null的许多注解,例如 javax.annotation.Nonnull,如果存在于字段上,会导致生成的setter中的显式空检查。

关于可空性的各种众所周知的注解,例如 org.eclipse.jdt.annotation.NonNull, 会自动复制到正确的位置(getter的方法,setter的参数)。您可以通过lombok配置键lombok.copyableAnnotations指定总是被复制到正确位置的额外注解。

您可以使用 @Getter@Setter注解来注释类。这样做等同于使用该注解对该类中的所有非静态字段进行注释。字段上的 @Getter/@Setter 注解优先于类上的该注解。

使用 AccessLevel.NONE 访问级别根本不生成任何内容。它仅在与 @Data 或类范围的 @Getter@Setter 结合使用时才有用。

@Getter 也可用于枚举。@Setter 不能用于枚举,不是出于技术原因,而是出于务实的原因:在枚举上的Setters是一个非常糟糕的主意。

附加部分

我的代码里面附加了对于常用的配置的使用示例,参见代码