详解Java中@Accessors注解(全)

目录

  • 前言
  • 1. 概念
  • 2. 属性
    • 2.1 fluent属性
    • 2.2 chain属性
    • 2.3 prefix属性

前言

关于该注解的学习,主要来源项目中涉及,对此进行查漏补缺

@Accessors 注解通常用于简化实体类的代码,使其更加简洁和易读。

1. 概念

@Accessors 是 Lombok(一种Java库)提供的注解之一,用于自动生成 getter 和 setter 方法,并可以配置一些属性。

以下是关于 @Accessors 注解的详细解释

常用属性:

  • fluent:如果设置为 true,生成的 getter 方法会移除 get 前缀,setter 方法移除 set 前缀。
  • chain:如果设置为 true,生成的 setter 方法会返回当前对象,支持方法链调用。
  • prefix:为生成的 getter 和 setter 方法添加指定前缀。

类似如下例子:

import lombok.AccessLevel;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

@ToString
@Accessors(chain = true, fluent = true)
public class Example {
    @Setter(AccessLevel.PROTECTED)
    private String name;

    private int age;
}

在上面的例子中,@Accessors 注解配置了 chain = true 和 fluent = true,表示生成的 setter 方法支持方法链调用,并移除了 get 和 set 前缀。

通过源码也可看出其配置的属性:

/**
 * A container for settings for the generation of getters and setters.
 * <p>
 * Complete documentation is found at <a href="https://projectlombok.org/features/experimental/Accessors">the project lombok features page for &#64;Accessors</a>.
 * <p>
 * Using this annotation does nothing by itself; an annotation that makes lombok generate getters and setters,
 * such as {@link lombok.Setter} or {@link lombok.Data} is also required.
 */
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Accessors {
	/**
	 * If true, accessors will be named after the field and not include a {@code get} or {@code set}
	 * prefix. If true and {@code chain} is omitted, {@code chain} defaults to {@code true}.
	 * <strong>default: false</strong>
	 * 
	 * @return Whether or not to make fluent methods (named {@code fieldName()}, not for example {@code setFieldName}).
	 */
	boolean fluent() default false;
	
	/**
	 * If true, setters return {@code this} instead of {@code void}.
	 * <strong>default: false</strong>, unless {@code fluent=true}, then <strong>default: true</strong>
	 * 
	 * @return Whether or not setters should return themselves (chaining) or {@code void} (no chaining).
	 */
	boolean chain() default false;
	
	/**
	 * If present, only fields with any of the stated prefixes are given the getter/setter treatment.
	 * Note that a prefix only counts if the next character is NOT a lowercase character or the last
	 * letter of the prefix is not a letter (for instance an underscore). If multiple fields
	 * all turn into the same name when the prefix is stripped, an error will be generated.
	 * 
	 * @return If you are in the habit of prefixing your fields (for example, you name them {@code fFieldName}, specify such prefixes here).
	 */
	String[] prefix() default {};
}

2. 属性

默认fluent、chain 都是false
对于false,其设定的值跟往常差不多!

举例如下:(主要为了区分fluent、chain以及prefix三个属性)

@Data
//@AllArgsConstructor
//@NoArgsConstructor
@TableName("test_user1")
@Accessors(chain = false,fluent = false)
public class User1 {
    @TableId(value = "id", type = IdType.AUTO)
    private int xxId;
    private String yyUserName;
    private int zzAge;
    // 其他字段...

    public static void main(String[] args) {
        User1 user1 = new User1();

        user1.setXxId(123);
        user1.setYyUserName("manong");
        user1.setZzAge(123);

        System.out.println(user1); // User1(xxId=123, yyUserName=manong, zzAge=123)
        System.out.println(user1.getZzAge()); // 123

    }
}

截图如下:

在这里插入图片描述

2.1 fluent属性

为了方便测试,原先fluent默认就是false,当修改为true的时候:

@Data
@TableName("test_user1")
@Accessors(fluent = true)
public class User1 {
    @TableId(value = "id", type = IdType.AUTO)
    private int id;
    private String username;
    private int age;
    // 其他字段...

    public static void main(String[] args) {
        User1 user1 = new User1();

        System.out.println(user1.id()); // 这个返回的值是int值,因为id为int类型
        System.out.println(user1.id(123)); // 这个返回的对象值是类

        System.out.println(user1.id()); // 再次看看id的属性为,123
        System.out.println(user1.age()); // 查看其age属性,发现为0



    }
}

截图如下:

在这里插入图片描述

对应的属性有如下:

  • 返回属性值
  • 返回对象

可以通过得到对象再去检查其他的属性:

在这里插入图片描述

2.2 chain属性

chain的区别在于可以链式设定值!

代码如下:

@Data
@TableName("test_user1")
@Accessors(chain = true)
public class User1 {
    @TableId(value = "id", type = IdType.AUTO)
    private int id;
    private String username;
    private int age;
    // 其他字段...

    public static void main(String[] args) {
        User1 user1 = new User1();

//        System.out.println(user1.setId(123)); // 返回对象
        user1.setAge(123).setUsername("manong");
        System.out.println(user1); // User1(id=0, username=manong, age=123)
        System.out.println(user1.getAge()); // 123


        User1 user2 = new User1().setAge(333).setUsername("yanjiuseng");
        System.out.println(user2); // User1(id=0, username=yanjiuseng, age=333)


    }
}

截图如下:

在这里插入图片描述

2.3 prefix属性

注意属性中的前缀后要开头大写!此处的前缀必须为string类型
比如id属性,为了加一个前缀xx,则属性值应该为xxId,如果为xxid代码会错!

代码如下:

@Data
@TableName("test_user1")
@Accessors(prefix = {"xx","yy","zz"})
public class User1 {
    @TableId(value = "id", type = IdType.AUTO)
    private int xxId;
    private String yyUserName;
    private int zzAge;
    // 其他字段...

    public static void main(String[] args) {
        User1 user1 = new User1();

        user1.setId(123);
        user1.setUserName("manong");
        user1.setAge(123);

        System.out.println(user1); // User1(xxId=123, yyUserName=manong, zzAge=123)
        System.out.println(user1.getAge()); // 123

    }
}

截图如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/301107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快手面经总结(2024最新)

快手 面经1-一面 开始先是手撕算法两道 自我介绍两道手撕 将字符串转化为整数 (这里当时出现溢出值问题&#xff0c;进行了思考解决&#xff0c;写了两种方式)synchronize &#xff0c; 可以使用的几种形式&#xff0c;代码写出 操作系统 和 数据结构 hash解决冲突 &#xff…

【认知计算】《智能追踪》

故事背景科技相关&#xff1a; 认知计算 意在使计算机系统能够像人的大脑一样学习、思考&#xff0c;并做出正确的决策。 模仿大脑从经验中学习&#xff0c;发现不同事物之间的联系&#xff0c;进而实现逻辑推理和记忆等功能。 认知计算是一种类脑计算模式&#xff0c;源自模…

我的创作纪念日——redis的历史纪录

机缘 最开始只想存留点Redis的操作信息&#xff0c;后来写着写着也就写多了&#xff0c;虽然后面很长时间由于忙就没继续写&#xff0c;但是还是偶尔登录看一下&#xff0c;有好几篇文章的浏览量还是很多的呢。 收获 收获不多&#xff0c;粉丝也才三十多个&#xff0c;浏览量感…

html 原生网页使用ElementPlus 日期控件el-date-picker换成中文

项目&#xff1a; 原生的html,加jQuery使用不习惯&#xff0c;新html页面导入vue3,element plus做界面&#xff0c;现在需要把日历上英文切成中文。 最终效果&#xff1a; 导入能让element plus日历变成中文脚本&#xff1a; elementplus, vue3对应的js都可以通过创建一个vu…

修改 docker /dev/shm 的大小

修改 docker /dev/shm 的大小 1&#xff0c;获取完整id&#xff1a; docker inspect 245| grep Id rootlynxi:~# docker inspect 245| grep Id"Id": "245ab167ed9a79873b31b3a38df2053870fe72f267c3c1a660df25c63e37e88b",2&#xff0c;修改 ShmSize&…

vueRouter 配合 keep-alive 不生效的问题

文章目录 问题说明案例复现demo 结构问题复现和解决 其实这个不生效的问题根本也不算一个问题&#xff0c;犯的错和写错单词差不多&#xff0c;但是也是一时上头没发现&#xff0c;所以记录一下&#xff0c;如果遇到同样的问题&#xff0c;也希望可以帮助你早点看到这个哭笑不得…

网络技术基础入门全套实验-厦门微思网络CCNA实验手册

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 微思简介&#xff08;https://www.xmws.cn) 微思成立于2002年&#xff0c;是一个诚信敬业、积极向上、充满活力、专注技术服务的企业。 微思获得了八…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…

[SpringBoot]自定义注解@AutoFill,实现公共字段自动填充(避免重复对时间属性初始化

对于时间属性&#xff0c;如createTime、updateTime在进行插入、修改操作时都要一个个初始化处理&#xff0c;过于麻烦。 可以自定义注解AutoFill作用于INSERT&#xff0c;UPDATE操作方法上&#xff0c;再自定义切面类&#xff0c;统一拦截加入了AutoFill注解的方法&#xff0c…

PAT 乙级 1076 Wifi密码

解题思路&#xff1a;首先这题看着复杂实际很简单&#xff0c;每题就一个正确的我们把他找出来就可以&#xff0c;之后利用和’A’ 相减加一 求出数值&#xff0c;输出即可。python代码更容易 c语言: #include<stdio.h> int main() {int n,i,j,count0;scanf("%d&q…

[ffmpeg系列 03] 文件、流地址(视频)解码为YUV

一 代码 ffmpeg版本5.1.2&#xff0c;dll是&#xff1a;ffmpeg-5.1.2-full_build-shared。x64的。 文件、流地址对使用者来说是一样。 流地址(RTMP、HTTP-FLV、RTSP等)&#xff1a;信令完成后&#xff0c;才进行音视频传输。信令包括音视频格式、参数等协商。 接流的在实际…

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

vue-springboot 音乐推荐系统 带歌词的音乐播放器系统设计与实现 7902c

少数民族音乐网站在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着少数民族音乐网站的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的音乐信息、音乐资讯、在线交流等功能。 此系统设计主要采用的是JAVA语言来进行开发&…

240107-RHEL8+RHEL9配置安装:NVIDIA驱动(15步)+CUDA(4步)+CUDNN(5步)+GPU压力测试

Section 0: 基础知识 CUDA、cuDNN 和 PyTorch 版本的选择与搭配指南 安装优先级: 显卡驱动 → CUDA → CUDA Toolkit → cuDNN → Pytorch 即显卡驱动决定了CUDA版本&#xff0c;CUDA版本决定了CUDA Toolkit、cuDNN、Pytorch各自的版本提前下载 &#xff5c; CUDA提前下载 &am…

分布式系统架构设计之分布式消息队列基础知识

随着微服务、大数据和云计算的普及&#xff0c;分布式系统已经成为现代软件架构的核心。在分布式系统中&#xff0c;各个组件间的通信和数据交换尤其重要&#xff0c;而消息队列正是实现这一目标的关键技术之一。 在分布式架构设计过程中&#xff0c;架构师们需要对消息队列有…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于两阶段随机优化的电能量与深度调峰融合市场出清模型及定价方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到一个电力市场的建模和定价方法&#xff0c;采用了两阶段随机优化的策略&#xff0c;目标是实现电能量与深度调峰的融合。下面是对标题中各个…

逆向一个Go程序

前奏 事先声明&#xff0c;自导自演&#xff0c;纯属为了演示基本的逆向思维 用Go写一段模拟登录的代码&#xff1a; package mainimport ("fmt" )func main() {pass : ""fmt.Print("input password:")fmt.Scan(&pass)if pass "hel…

DTD(文档类型定义)

一、简介 为什么使用DTD 通过 DTD&#xff0c;您的每一个 XML 文件均可携带一个有关其自身格式的描述。 通过 DTD&#xff0c;独立的团体可一致地使用某个标准的 DTD 来交换数据。 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。 您还可以使用 DTD 来验…

【架构专题】不会业务稳定性建设架构师直接开除!!!

为什么要做业务稳定性建设&#xff1f; 首先&#xff0c;什么是业务稳定性建设&#xff1f;顾名思义&#xff0c;就是保证系统的稳定运行&#xff0c;让用户不受任何影响地使用产品。对于一个企业来说&#xff0c;这非常重要&#xff0c;因为如果产品出现问题&#xff0c;那么…

Kafka(六)消费者

目录 Kafka消费者1 配置消费者bootstrap.serversgroup.idkey.deserializervalue.deserializergroup.instance.idfetch.min.bytes1fetch.max.wait.msfetch.max.bytes57671680 (55 mebibytes)max.poll.record500max.partition.fetch.bytessession.timeout.ms45000 (45 seconds)he…