引言

你可以对任何字段使用@Getter@Setter注解,然后Lombok将自动为其生成默认的getter和setter方法。

如果该字段名为foo。默认的getter方法将简单的返回该字段的值,该方法将会被命名为getFoo(如果该字段类型为boolean,将命名为isFoo)。默认的setter方法将命名为setFoo,返回值为void并带有一个类型与foo相同的参数,然后简单的进行赋值操作。

除非像实例中那样显示得指定访问级别,生成的getter和setter方法都将是public级别。合法的访问级别有:PUBLICPROTECTEDPACKAGE,和 PRIVATE

如果希望对类中所有非static字段生成getter和(或)setter,你可以在该类的声明上添加@Getter和(或)@Setter

你可以在@Getter@Setter@Data注解的类中使用特殊的访问级别AccessLevel.NONE来禁止Lombok自动生成getter和setter。

可以使用onMethod=@__({@AnnotationsHere})在生成方法上放置一些其他的注解(@AnnotationsHere);可以使用onParam=@__({@AnnotationsHere})在生成方法参数上放置一些其他的注解(@AnnotationsHere);另外请注意这是个实验特性,更多信息参见关于onX特性的文档。

v1.12.0的更新:
字段上的javadoc将被复制到生成的getter和setter方法上。通常是所有文档都会被复制,@return将会移动到getter方法上,@param移动到setter方法上。出现移动操作,也就意味着从原javadoc文本中删除,这一部分将不会被直接复制。还可以为每一个getter和setter定义单独的文本。为此需要创建名为GETTERSETTER的‘片段’,一个片段在javadoc中就是一行文字,片段名必须为--GETTER--或者--SETTER--。如果使用片段,Lombok则不再对@return@param进行移除操作,所以需要将其放置到指定的片段中。

使用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] (default: false)
默认为false。如果设置为true,生成的setter方法返回值将用this代替void。使用@Accessors显式配置链参数优于这个配置。

lombok.accessors.fluent = [true | false] (default: false)
默认为false。如果设置为true,生成的getter和setter方法将不使用标准得bean前缀(get、is、set),方法直接使用字段名作为方法名(没有前缀)。使用@Accessors显式配置链参数优于这个配置。

lombok.accessors.prefix += a field prefix (default: empty list)
这是一个list属性,默认为空list;使用+=操作符添加属性。使用-=操作符从父配置文件中移除已添加的前缀属性。Lombok将从字段名称中删除任何匹配的字段前缀,以便确定要生成的getter/setter的名称。例如,如果m是这个设置中列出的前缀之一,那么名为mFoobar的字段将导致名为getFoobar()的getter,而不是getMFoobar()。使用@Accessors显式配置前缀参数优于这个配置。

lombok.getter.noIsPrefix = [true | false] (default: false)
默认为fasle。如果设置为true,为boolean类型字段生成的getter将以get而不是is作为前缀,同时其他的生成方法(如@ToString)中进行调用的地方也会发生变化。

lombok.setter.flagUsage = [warning | error] (default: not set)
默认不进行设置,配置后Lombok将会把使用@Setter的类标记为错误或者警告。

lombok.getter.flagUsage = [warning | error] (default: not set)
默认不进行设置,配置后Lombok将会把使用@Getter的类标记为错误或者警告。

小提示

关于生成的方法名,如果字段首字母是小写,则会进行标题大写处理(首字母大写),否则保持不变,然后加上get/set/is等前缀。

如果已经存在与生成方法名(大小写不敏感)相同、参数个数相同*(这个地方表述可能有些不对,实际上是不考虑参数个数的)*, 都不在生成对应的方法。例如,如果已经有方法getFoo(String … x),则不会生成getFoo(),即使在技术上可以制作该方法。这主要是为了避免混淆,如果因为这个原因跳过生成方法,Lombok将会发出警告:Varargs count as 0 to N parameters。您可以使用@ lombok.experimental.Tolerate使其对Lombok隐藏。

对于boolean类型的字段,如果字段名以is开头,然后紧接着是首字母大写的名称,则生成的方法名将不再额外添加前缀。

一些boolean的变体可能会导致生成方法使用get作为前缀而不是is。比如,返回java.lang.Boolean会产生get前缀,而不是is前缀。

有很多流行的表示非null的注解,比如javax.annotation.Nonnull。如果字段上使用这些注解,生成的

一些总所周知的关于null检测的注解(如@org.eclipse.jdt.annotation.NonNull)将会自动的拷贝到相应的位置(getter方法和setter的参数)。可以配置lombok.copyableAnnotations选项来定义Lombok拷贝的额外注解。

你可以在对类使用@Getter@Setter注解,其实就是相当于对该类的所有非静态字段使用这个注解。在字段上显式使用@Getter@Setter注解由于类上的注解。

使用AccessLevel.NONE访问级别后Lombok将不会生成任何代码。但是必须与@Data或者类级别的@Getter@Setter一起使用才有效。

@Getter还可以用于枚举类,但是@Setter不行。这并不是技术原因,而是一个实用性问题:在枚举类上使用setter是一个非常糟糕的主意。

原文地址:https://projectlombok.org/features/GetterSetter

——————————————————————————
行路不知花开处,蓦然回首芷兰香。