【每天学个新注解】Day 2 Lombok注解简解(一)—@Data、@Build、@Value

news2024/11/15 21:52:25

@Data

相当于同时使用了 @Getter 、@Setter 、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode

1、如何使用

  • 需要同时使用@Getter 、@Setter 、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode注解一个Bean的时候。

2、代码示例

例:

@Data
public class People {
    private String name;
    private int age;
    private String sex;
}

@Builder

帮助我们简化 Builder 模式的实现过程
Builder模式(创建者模式):创建型设计模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,提供一种通过链式方法来创建一个复杂的对象。

1、如何使用

  • 注解在类上,会生成一个名为builder的静态方法以及各属性的链式设置方法,最后通过 build 方法来构建对象。
  • 在构造函数上使用 @Builder 注解,可以控制哪些字段需要在 builder 中出现。比如,我们可能有一个包含很多字段的类,但只希望部分字段可以通过 builder 来设置。
  • 字段在 builder 模式中有默认值,我们可以在构造函数中设置。

2、代码示例

例:

@Builder
@ToString
public class People {
    private String name;
    private int age;
    private String sex;
}

那么创建对象时就可以通过builder静态方法实现

public class Test {
    public static void main(String[] args) {
        People p = People.builder()
                .name("tom")
                .age(18)
                .sex("男")
                .build();
        System.out.printf(p.toString() + "\n");
    }
}

在这里插入图片描述
例:

@ToString
public class People {
    private String name;
    private int age;
    private String sex;

    @Builder
    public People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = (sex==null)?"未知":sex;
    }
}		

那么创建对象时就可以通过builder静态方法实现

public class Test {
    public static void main(String[] args) {
        People p = People.builder()
                .name("tom")
                .age(18)
                .build();
        System.out.printf(p.toString() + "\n");
    }
}

当不设置sex的值时,可以通过默认值取到“未知”。
在这里插入图片描述

@Value

创建不可变类
不可变类的特点是它的状态在对象创建后不能被修改,这在多线程环境中尤其有用。

1、如何使用

  • 需要创建不可变类的时候,在类上添加该注解。
  • @Value 注解是 @Data 的不可变版本,自动生成所有字段的 getter 方法、toString 方法、equals 和 hashCode 方法,以及一个全参数的构造函数,并将所有字段设为 private 和 final。

2、代码示例

例:

@Value
public class People {
    private String name;
    private int age;
    private String sex;
}

编译后:

import lombok.Generated;

public final class People {
    private final String name;
    private final int age;
    private final String sex;

    @Generated
    public People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated
    public String getName() {
        return this.name;
    }

    @Generated
    public int getAge() {
        return this.age;
    }

    @Generated
    public String getSex() {
        return this.sex;
    }

    @Generated
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof People)) {
            return false;
        } else {
            People other = (People)o;
            if (this.getAge() != other.getAge()) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                Object this$sex = this.getSex();
                Object other$sex = other.getSex();
                if (this$sex == null) {
                    if (other$sex != null) {
                        return false;
                    }
                } else if (!this$sex.equals(other$sex)) {
                    return false;
                }

                return true;
            }
        }
    }

    @Generated
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.getAge();
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $sex = this.getSex();
        result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
        return result;
    }

    @Generated
    public String toString() {
        return "People(name=" + this.getName() + ", age=" + this.getAge() + ", sex=" + this.getSex() + ")";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H5白色大方图形ui设计公司网站HTML模板源码

源码名称:白色大方图形ui设计公司网站模板源码 源码介绍:一款H5自适应白色大方图形ui设计公司官网网站模板源码。源码含有七个页面,可用于各种设计公司官网。 需求环境:H5 下载地址: https://www.51888w.com/369.ht…

基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,宠物种类,商家,咨询商家,用户宠物,宠物托管,宠物状况,宠物用品,用品分类,商家公告,结束托管,账单信息,延长托管 开题报告内容 基于Vue框架的宠物托管系统设计与实现开题报告 一、引言 随着现代生活节奏的加快,越来越…

如何在Linux Centos7系统中挂载群晖共享文件夹

前景:企业信息化各种系统需要上传很多的图片或者是文件,文件如何在群晖中显示,当文件或者图片上传到linux指定文件夹内,而文件夹又与群晖共享文件夹进行挂载,就能保证上传的文件或者图片出现在群晖并在群晖里进行管理。…

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包,关闭防火墙和核心防护 2.安装环境依赖包,桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…

Rumor Mitigation in Social Media Platforms with Deep Reinforcement Learning

ABSTRACT 社交媒体平台已成为人们传播和获取信息的主要渠道之一,其可靠性受到网络谣言的严重威胁。现有的辟谣手段如暂停用户、播放真实信息等,要么成本高,要么扰乱用户。在本文中,我们引入了一种新颖的谣言缓解范例,…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步:查看当前的密码是什么? 打开redis-cli.exe,输入config get requirepass,查看当前的密码是什么? 接着,修改redis的配置文件,找到redis的安装目录,找到相关的conf文件&#x…

Spring高手之路24——事务类型及传播行为实战指南

文章目录 1. 编程式事务(不推荐)2. 声明式事务(推荐)3. 事务的传播行为(复杂混合事务场景及时序图说明)3.1 NESTED和REQUIRES_NEW传播行为的区别 1. 编程式事务(不推荐) 定义&#…

如何从 Nutanix 迁移至 SmartX 超融合?解读 4 类迁移方案和 2 例迁移实践

2022 年底,Nutanix(路坦力)正式宣布将中国市场交由合作伙伴(联想)主导销售,并于 2023 年 8 月完成全面转型。转型后,虽然中国用户依旧可以使用 Nutanix 产品,但在软件的续保和维保方…

企业EMS -能源管理系统-能源管理系统源码-能源在线监测平台

能源管理系统是以帮助工业生产企业在扩大生产的同时,合理计划和利用能源,降低单位产品能源消耗,提高经济效益,降低CO2排放量为目的信息化管控系统。 我国能源管理从上世纪80年代中期开始,通过“能量平衡测试”、“能源…

安卓数据存储——SharedPreferences

共享参数 SharedPreferences 1、sharedPreferences是Android的一个轻量级存储工具,采用的存储结构是key - value的键值对方式 2、共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml 使用场景&…

【Java】掌握Java:基础概念与核心技能

文章目录 前言:1. 注释2. 字面量3. 变量详解3.1 变量的定义3.2 变量里的数据存储原理3.3 数据类型3.4 关键字、标识符 4. 方法4.1 方法是啥?4.2 方法的完整定义格式4.3 方法如何使用:4.4 方法的其他形式4.5 方法的其他注意事项4.5.1 方法是可…

WebMagic:强大的Java网络爬虫框架

上班苦上班累,上班就想打瞌睡。 在当今信息爆炸的时代,数据的获取和处理变得越来越重要。网络爬虫作为获取网络数据的重要工具,已经成为许多开发者和数据科学家的必备技能。今天,我们将介绍一个广受欢迎的Java网络爬虫框架——We…

2024PDF内容修改秘籍:工具推荐与技巧分享

现在我们使用PDF文档的频率越来越高了,很多时候收到的表格之类的资料也都是PDF格式的,如果进行转换之后编辑再转换为PDF格式还是有点麻烦的,那么pdf怎么编辑修改内容呢?这篇文章我将介绍几款可以直接编辑PDF文件的工具来提高我们的…

鸿蒙开发(NEXT/API 12)【跨设备互通NDK开发】协同服务

跨设备互通提供跨设备的相机、扫描、图库访问能力,平板或2in1设备可以调用手机的相机、扫描、图库等功能。 说明 本章节以拍照为例展开介绍,扫描、图库功能的使用与拍照类似。 用户在平板或2in1设备上使用富文本类编辑应用(如:…

JVM —— 类加载器的分类,双亲委派机制

文章目录 一、类加载器的分类【理解】1.1 概述1.2 JDK8及之前的版本1.2.1 启动类加载器1.2.2 扩展类加载器和应用程序类加载器扩展类加载器应用程序类加载器 1.3 JDK9之后的类加载器1.4 ClassLoader 中的两个方法【应用】 二、双亲委派模型【理解】2.1 什么是双亲委派机制面试题…

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路

什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress,添加相关配置文件,选择主题,描述,框架等 npx vitepress init //…

9.20日学习记录及相关问题解答

部分一 今天看了一本古老的书。学到了一些有关计算机的远古的知识。弥补了一些之前没有意识到的空白点。 原来上个世纪就有AI这个东西了 现阶段的主流模式,在许多年前其实是将来要发展的对象。 B/S指的是客户机/服务器结构模式 C/S是在B/S基础上发展过来的。三层结…

兼容多个AI应用接口,支持用户自定义切换AI接口

项目背景 2023年ChatGPT横空出世,给IT行业造成了巨大的反响。我第一次发现这个ChatGPT有着如此神奇的功能(智能对话,知识问答,代码生成,逻辑推理等),我感到非常吃惊!经过一番学习和…

一文看懂 Python 正则表达式,解决你的字符串难题!(Python正则表达式使用指南)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Re正则 📒📝 re 模块简介📝 正则表达式语法总结📝 re 模块参数总结📝 常用方法📝 正则表达式的技巧与注意事项📝 使用 `re.compile()` 实现编译模式⚓️ 相关链接 ⚓️📖 介绍 📖 在编程世界中,有一种强大的…

Lanterns (dp 紫 线段树 二分 维护dp)

Lanterns - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 让所有点被覆盖,那么状态可以设计成覆盖一段前缀,并且中间不允许出现断点 由于CF崩了,所以暂时没提交代码。 记f(i) 为前 i 个灯笼点亮的最长前缀。 由于答案具有保留性&#xff…