首页 > 其他分享 >Lombok 使用教程-@Accessors | 自定义getters和setters的生成格式

Lombok 使用教程-@Accessors | 自定义getters和setters的生成格式

时间:2024-08-13 09:52:54浏览次数:19  
标签:Accessors 自定义 getters 源码 注解 lombok true 前缀

作者简介:大家好,我是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下的验证结果当作最终结果的水货们请闭嘴】

一、实验性功能说明

lombok v0.11.0中,@Accessors被作为实验性功能引入。

添加原因:

  • 我们可能希望将这些功能集成到一个更完整的属性支持概念中。
  • 新功能 - 社区反馈。

当前状态:中性 - 预计会有一些变化。这些变化是为了向后兼容,但应该从实验性功能开始。

  • 开放的功能请求:以小写字母开头的属性的命名行为,后面是大写字母。一半的规范、工具和lombok用户喜欢把名为uLimit的字段变成getULimit(包括lombok),另一半则转向喜欢getuLimit@Accessors可以参与任何解决这一要求的更新。
  • 开放功能请求:更多地控制命名访问器;例如,解决创造性命名的布尔属性:将 boolean wasRunning 转换为 boolean wasRunning() 而不是 boolean isWasRunning(),以及更广泛的前缀支持。如果解决此功能请求,将涉及@Accessors
  • @Accessors目前没有从字段@Accessors注解 "级联 "到类级@Accessors注解,但它确实 "级联 "到lombok.config。改变这一点并不困难,但是向后不兼容。它不可能破坏很多现有的代码,但在该功能脱离实验状态之前,需要对此作出决定。

二、简介

@Accessors注解被用来配置lombok如何生成和寻找getterssetters

默认情况下,lombok遵循bean规范的gettersetter。例如,一个名为pepper的字段的gettergetPepper。然而,有些人可能想打破Bean的规范,以便最终得到更漂亮的API@Accessors让你做到这一点。

有些程序员喜欢为他们的字段使用前缀,例如他们写fPepper而不是pepper。我们强烈反对这样做,因为你无法对前缀的有效性进行单元测试,而且重构脚本可能会把字段变成局部变量或方法名称。此外,如果你想让这些信息即时可见,你的工具(比如你的编辑器)可以照顾到以某种方式呈现标识符的问题。尽管如此,你也可以通过@Accessors列出你的项目使用的前缀。

因此,@Accessors有3个选项:

  • fluent - 布尔值。默认值:false。如果为truepeppergetter就是pepper()setter就是pepper(T newValue)。此外,如果指定,那么chain默认为true
  • chain - 布尔值。如果为true,则生成的setter返回该值,而不是void。默认值:false,如果fluent=true,默认值为true
  • prefix - 一个字符串的列表。如果存在,字段必须以这些前缀中的任何一个为前缀。每个字段名依次与列表中的每个前缀进行比较,如果发现匹配,则剥离前缀以创建该字段的基本名称。在列表中包含一个空字符串是合法的,这将总是匹配的。对于属于字母的字符,前缀后面的字符不能是小写字母,即pepper甚至不能与前缀p匹配,但pEpper可以匹配(这意味着这个字段的基本名称是epper)。

@Accessors注解在类型和字段上都是合法的;如果存在的话,适用的注解是字段上的,否则就是类上的。当一个字段上的@Accessors注解存在时,字段所在的类上的任何@Accessors注解都会被完全忽略,甚至对于没有配置在字段上的@Accessors的属性。这与任何lombok.config配置键相反,这些配置键在任何明确的@Accessors注解没有指定的情况下作为后备默认。

三、示例比较

1. Lombok 写法

    import lombok.experimental.Accessors;
    import lombok.Getter;
    import lombok.Setter;
    
    @Accessors(fluent = true)
    public class AccessorsExample {
      @Getter @Setter
      private int age = 10;
    }
    
    class PrefixExample {
      @Accessors(prefix = "f") @Getter
      private String fName = "Hello, World!";
    }

2. Java 标准写法

    
    public class AccessorsExample {
      private int age = 10;
      
      public int age() {
        return this.age;
      }
      
      public AccessorsExample age(final int age) {
        this.age = age;
        return this;
      }
    }
    
    class PrefixExample {
      private String fName = "Hello, World!";
      
      public String getName() {
        return this.fName;
      }
    }

四、支持的配置项

lombok.accessors.chain = [true | false] (默认: false)
如果设置为true,任何没有@Accessors注解的类,或者有,但该注解没有明确的chain参数值,将像@Accessors(chain = true)存在一样行事。

lombok.accessors.chain = [true | false] (默认: false)
如果设置为true,任何没有@Accessors注解的类,或者有,但该注解没有明确的fluent参数值的类,将像@Accessors(fluent = true)存在一样行事。

lombok.accessors.prefix += 字段前缀 (默认: empty list)
这是一个列表属性;可以用+=操作符添加条目。从父级配置文件中继承的前缀可以用-=操作符删除。任何没有@Accessors注解的类,或者有,但该注解没有明确的prefix参数值的类,将像@Accessors(prefix = {配置中列出的前缀})一样行事。

lombok.accessors.flagUsage = [warning | error] (默认: not set)
Lombok@Accessors的任何使用标记为警告或错误(如果已配置)。

五、附属说明

最近的@Accessors注解也被用于lombok中寻找getters的各种方法,比如@EqualsAndHashCode

如果提供了一个前缀列表,而一个字段没有以其中一个开头,那么这个字段会被lombok完全跳过,并且会产生一个警告。

参考文献

【1】@Accessors | A more fluent API for getters and setters.

标签:Accessors,自定义,getters,源码,注解,lombok,true,前缀
From: https://blog.csdn.net/smart_an/article/details/141150987

相关文章

  • 【ZYNQ MPSoC开发】PL使用自定义IP后Vitis编译报错的解决方法
    问题发现:    在使用Alinx的AXU3EG开发板学习自定义IP时,发现PWM控制呼吸灯频率实验中,由于在PL端使用了自定义IP,Vitis编译PS端程序时会报错。问题所在:    这个问题并不是一个bug,而是官方希望使用者自行为自定义IP编写驱动和Makefile。虽然灵活性增加了,但同......
  • 4.自定义的信号和槽
    自定义信号1.写到signal下2.返回void3.需要声明,不需要实现4.可以有参数,可以重载自定义槽函数1.返回void2.需要声明,也需要实现3.可以有参数,可以重载4.写到pulicslot下或者pulic或者全局函数触发自定义的信号1.emit自定义信号案例:下课后,老师触发饿了信号,学生响应信号......
  • ROS 2 自定义接口(消息、服务和动作)
    ROS2自定义接口(消息、服务和动作)在ROS2中,自定义接口是构建复杂机器人系统的核心。自定义接口使开发者能够定义特定于应用的数据结构和通信模式,包括消息(Message)、服务(Service)和动作(Action)。本文将介绍如何在ROS2中创建和使用这些自定义接口。1.自定义消息(Message)......
  • vue2 - element弹框自定义指令 实现拖动、缩放
    directive/dialogDrag.jsimportVuefrom"vue";Vue.directive('dialogDrag',{bind(el,binding,vnode,oldVnode){//弹框可拉伸最小宽高letminWidth=400;letminHeight=300;//初始非全屏letisFullScreen......
  • el-tree 组件自定义样式 最后一级flex,其余级别正常block
    先上需求的效果图el-tree的样式一般全都是block换行的,如下图先分析一下,1.树结构的级别是不确定的,但是样式上要求最后一个层级需要横着排列,其余竖着排,超出需要换行2.如何找到每一个数据项的最后一级呢?3.找到之后怎么办?ok,then,1.先通过插槽吧,因为这样咱们可以自定义最后一......
  • Vue自定义指令——函数式与对象式以及注意事项
    作者:CSDN-PleaSure乐事欢迎大家阅读我的博客希望大家喜欢使用环境:vscodeChrome浏览器目录1.什么是自定义指令1.1定义2.函数式自定义指令2.1定义2.2书写格式与效果3.对象式自定义指令3.1定义3.2书写格式与效果4.需要注意的坑4.1命名4.1.1问题4.1.2原因4.1.3......
  • C#窗体自定义快捷操作键的实现 - 开源研究系列文章
          这次想到应用程序的窗体的快捷操作键的使用的问题。      上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051),区别在于它是操作系统全局注册的热键,如果其它应用程序注册了对应的热键,那就会失效。此例子是对某个窗体里的按键的操作进行的......
  • 029.Vue3入门,父页面自定义Event传给子页面,子页面通过此Event回传数据给父页面
    1、App.vue代码:<template><Father/></template><scriptsetup>importFatherfrom'./view/Father.vue'</script><style></style>2、Father代码如下:<template><h3>父页面</h3><p>......
  • zabbix-agent自定义配置监控项
    zabbix-agent自定义配置监控项1.环境准备本例中安装zabbix开源软件和zabbix运行所需的中间件和数据库apache、php和postgres,软件版本信息如下:软件版本zabbixZabbix6.4.0apachehttpd-2.4.57aprapr-1.7.4apr-util1.6.3php8.2.6sqlite-autoconf342......
  • 掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置
    title:掌握Nuxt3的页面元数据:使用definePageMeta进行自定义配置date:2024/8/11updated:2024/8/11author:cmdragonexcerpt:摘要:本文详细介绍Nuxt3框架中definePageMeta的使用方法,包括如何为页面组件定义元数据,如布局、过渡效果、路由中间件等。通过具体示例展示......