2024-01-10  阅读(4)
原文作者:猫巳 原文地址: https://moonce.blog.csdn.net/article/details/121789714

一、简介

你可以用@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是一个非常糟糕的主意。

参考文献

【1】@Getter and @Setter | Never write public int getFoo() {return foo;} again.


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文