Lombok 使用教程-@Getter 和 @Setter | 如何优雅的进行对象的getter和setter操作

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

一、简介

你可以用@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.

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值