04、Lombok 实战教程 - @Getter 和 @Setter | 如何优雅的进行对象的getter和setter操作

一、简介

你可以用@Getter@Setter来注解任何字段,让lombok自动生成默认的getter/setter

如果字段名为foo,一个默认的getter则被命名为getFoo(如果字段的类型是布尔型,则被称为isFoo)。一个默认的setter被命名为setFoo,返回void,并且需要一个与字段类型相同的参数。它只是将字段设置为这个值。

生成的getter/setter方法访问级别将是public,除非你明确指定一个AccessLevel,如下面的例子中所示。合法的访问级别是PUBLICPROTECTEDPACKAGEPRIVATE

你也可以给一个类加上@Getter@Setter注解。在这种情况下,就好像你用注解来注解该类中的所有非静态字段一样。

要把注释放在生成的方法上,你可以使用onMethod=@__({@AnnotationsHere});要把注释放在生成的setter方法的唯一参数上,你可以使用onParam=@__({@AnnotationsHere}) 。不过要小心! 这是一个实验性的功能。更多细节请看关于onX功能的文档。

Lombokv1.12.0中的新功能:该字段上的javadoc现在将被复制到生成的gettersetter。通常,复制所有文本,@return移动到getter,而@param行移动到setter。移动意味着:从字段的javadoc中删除。还可以为每个getter/setter定义唯一的文本。为此,创建一个名为GETTERSETTER的“section”。sectionjavadoc中包含2个或多个破折号的一行,然后是文本“GETTER”或“SETTER”,后跟2个或多个破折号,行上没有其他内容。如果使用section,则不再对该节执行@return@param剥离(将@return@param行移到section中)。

二、示例比较

1. 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);
  }
}

2. 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将返回该值(而不是void)。@Accessors注释的显式配置链参数优先于此设置。

lombok.accessors.fluent = [true | false] (默认: false)
若设置为true,生成的gettersetter将不会以bean标准[getisset]作为前缀;相反,这些方法将使用与字段相同的名称(减去前缀)。@Accessors注释的显式配置链参数优先于此设置。

lombok.accessors.prefix += 字段前缀 (默认: empty list)
这是一个列表属性;可以用+=操作符添加条目。从父级配置文件中继承的前缀可以用-=操作符删除。Lombok将从一个字段的名称中剥离任何匹配的字段前缀,以确定要生成的getter/setter的名称。例如,如果m是这个设置中列出的前缀之一,那么一个名为mFoobar的字段将导致一个名为getFoobar()的获取器,而不是getMFoobar()。明确配置的@Accessors注解的前缀参数优先于此设置。

lombok.getter.noIsPrefix = [true | false] (默认: false)
如果设置为true,为布尔字段生成的getter将使用get前缀,而不是默认的is前缀,任何调用getter的生成代码,如@ToString,也将使用get而不是is

lombok.setter.flagUsage = [warning | error] (默认: not set)
Lombok@Setter的任何使用标记为warningerror(如果已配置)。

lombok.getter.flagUsage = [warning | error] (默认: not set)
Lombok@Getter的任何使用标记为warningerror(如果已配置)。

lombok.copyableAnnotations = [完全限定类型的列表] (默认: empty list)
Lombok会把这些注解中的任何一个从字段复制到setter参数和getter方法中。请注意,Lombok "开箱即用 "了一堆注释,这些注释是已知的可复制的。所有流行的nullable/nonnull注解。

四、附属说明

在生成方法名时,如果字段的第一个字符是小写字母,就会被冠以大写字母,否则就不作修改。然后,get/set/is是前缀。

如果有任何方法已经存在,并且具有相同的名称(不区分大小写)和相同的参数数量,则不会生成任何方法。例如,如果已经有了getFoo(String...x)方法,那么getFoo()就不会被生成,尽管从技术上来说,有可能生成该方法。这个注意事项的存在是为了防止混淆。如果因为这个原因跳过了方法的生成,将会发出一个警告。Varargs算作0N个参数。你可以用@lombok.experimental.Tolerate标记任何方法,以便从lombok中隐藏它们。

对于以is开头,后面紧跟一个大写字母的布尔字段,生成的getter名称没有任何前缀。

boolean的任何变化都会导致使用get前缀而不是is前缀;例如,返回java.lang.Boolean的结果是get前缀,而不是is前缀。

一些来自流行库的注释表示非空,例如javax.annotation.Nonnull,如果在字段上存在,会导致在生成的setter中进行明确的空检查。

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

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

使用AccessLevel.NONE访问级别不会产生任何结果。它只在与@Data或全类的@Getter或@Setter结合时有用。

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