当前位置: 首页 > news >正文

java中实体类常见的设计模式

实体类常见的设计模式

1. Set 链式编程

在实体类中实现链式调用通常是指让 setter 方法返回当前对象实例this),从而允许连续调用多个 setter 方法设置属性值。这种方式可以使代码更加简洁和直观。

例如实体类为:

public class Person {private String name;private int age;public Person setName(String name) {this.name = name;return this; // 返回当前实例以支持链式调用}public Person setAge(int age) {this.age = age;return this;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + '}';}
}

使用:

Person person = new Person().setName("John").setAge(30);
System.out.println(person);

这种方式非常适合那些属性不是很多,或者不强制要求所有属性都必须初始化的情况。

可以使用 @Accessors(chain = true) 注解来自动启用链式调用(使用方式在后面)。

2. 构建者设计模式

当一个类有很多属性,特别是有些是可选的时候,使用传统的构造函数或链式 setter 方法可能会导致代码冗长且不易维护。构建者设计模式通过分离对象的构造过程与表示来解决这个问题,使得创建复杂对象的过程更加清晰和灵活。

例如实体类为:

public class Person {private final String name;private final int age;// 私有构造函数,防止直接实例化private Person(Builder builder) {this.name = builder.name;this.age = builder.age;}public static class Builder {private String name;private int age;public Builder name(String name) {this.name = name;return this; // 返回当前 Builder 实例以支持链式调用}public Builder age(int age) {this.age = age;return this;}public Person build() {return new Person(this); // 使用 Builder 中的数据创建新的 Person 实例}}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + '}';}
}

使用:

Person person = new Person.Builder().name("John").age(30).build();
System.out.println(person);

构建者模式特别适用于需要构建的对象具有许多可选参数的情况。它不仅提高了代码的可读性,也避免了构造函数参数列表过长的问题。

可以使用 @Builder 注解可以轻松实现构建者模式(使用方式在后面)。

3. 其它

3.1 两者与 Lombok 一同使用的问题

Lombok 是一个非常流行的 Java 库,它通过注解来减少样板代码,例如 getter、setter、构造函数等。然而,当你在同一个类中同时使用 Lombok 注解与手动实现的 Set 链式编程或构建者设计模式时,可能会遇到一些问题或冲突。

  1. Set 链式编程与 Lombok

    如果你使用 Lombok 的 @Setter 注解,并尝试手动实现链式 setter 方法,可能会出现以下问题:

    1. 方法重复
    2. 不可预期的行为

    为了解决这个问题,你可以选择不使用 Lombok 的 @Setter 注解,而是完全手动编写所有需要的 setter 方法,或者利用 Lombok 的 @Accessors(chain = true) 注解来自动启用链式调用。例如:

    @Getter @Setter @Accessors(chain = true)
    public class Person {private String name;private int age;
    }
    
  2. 构建者设计模式与 Lombok

    Lombok 提供了对构建者模式的支持,通过 @Builder 注解可以轻松实现构建者模式,避免手动编写复杂的 Builder 类。但是,如果同时手动实现构建者模式和使用 Lombok 的 @Builder 注解,则可能会遇到类似的问题:

    • 代码冗余
    • 冲突

    为了避免这种情况,你应该选择一种方式来实现构建者模式。如果你希望利用 Lombok 简化代码,可以删除手动编写的 Builder 实现,转而使用 Lombok 的 @Builder 注解:

    @Getter
    @Builder
    public class Person {private final String name;private final int age;
    }
    

总之,在结合使用 Lombok 与自定义的 Set 链式编程或构建者设计模式时,关键是保持一致性并理解 Lombok 在背后所做的工作。通常情况下,推荐充分利用 Lombok 提供的相关注解来简化这些模式的实现,除非有特定的需求要求手动控制。这样做不仅可以减少出错的机会,还能让代码更加简洁易读。

3.2 又想方便编程、又想使用 Lombok 怎么做

  1. 使用 @Accessors(chain = true) 和其他 Lombok 注解

    当你想为你的实体类启用链式 setter 方法同时又希望自动生成 toStringequalshashCode 方法时,你可以这样做:

    @Getter @Setter @Accessors(chain = true)
    @ToString
    @EqualsAndHashCode
    public class Person {private String name;private int age;
    }
    

    在这个例子中,@Getter@Setter 自动生成所有属性的 getter 和 setter 方法,@Accessors(chain = true) 使得 setter 方法支持链式调用。@ToString 自动生成 toString 方法,而 @EqualsAndHashCode 自动生成 equalshashCode 方法。

  2. 使用 @Builder 和其他 Lombok 注解

    如果你想使用构建者模式(通过 @Builder 注解),同时还需要 toStringequalshashCode 方法,同样可以直接将这些注解添加到你的类上:

    @Getter // 注意:通常与 @Builder 一起使用时不需要 @Setter,除非你确实需要setter方法
    @Builder
    @ToString
    @EqualsAndHashCode
    public class Person {private String name;private int age;
    }
    

    这里需要注意的是,通常当你使用 @Builder 时,你可能不会为所有字段提供 setter 方法(因为 Builder 模式本身提供了设置属性值的方法)。然而,如果你确实需要 setter 方法,你可以继续使用 @Setter 注解。

3.3 总结

虽然使用了 Set 链式编程、构建者设计模式 能更方便快捷的实现一个类,但是也产生了与 Lombok 之间的冲突,导致不能直接使用类似 @Data 等注解生成一些方法,但这个问题总的来说,是可以忽略的。

毕竟鱼和熊掌不可兼得,合适的场景使用合适的方法即可。

相关文章:

java中实体类常见的设计模式

实体类常见的设计模式 1. Set 链式编程 在实体类中实现链式调用通常是指让 setter 方法返回当前对象实例(this),从而允许连续调用多个 setter 方法设置属性值。这种方式可以使代码更加简洁和直观。 例如实体类为: public clas…...

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…...

发行思考:全球热销榜的频繁变动

几点杂感: 1、单机游戏销量与在线人数的衰退是剧烈的,有明显的周期性,而在线游戏则稳定很多。 如去年的某明星游戏,最高200多万在线,如今在线人数是48名,3万多。 而近期热门的是MH,在线人数8…...

docker目录挂载与卷映射的区别

在 Docker 中,目录挂载(Bind Mount)和卷映射(Volume Mount)的命令语法差异主要体现在路径格式上,具体表现为是否以斜杠(/)开头。以下是两者的核心区别及使用场景的总结: …...

`label` 标签的 `for` 属性详解

一、基本概念 label 标签的 for 属性用于将标签与表单控件(如 input、select 等)绑定,其值需与目标元素的 id 完全匹配。这种关联允许用户点击标签时触发控件交互(如聚焦输入框或切换复选框),提升操作便捷…...

公开笔记:自然语言处理(NLP)中文文本预处理主流方法

在自然语言处理(NLP)领域,将中文文本转化为数字的主流方法主要集中在预训练语言模型和子词编码技术上。这些方法能够更好地捕捉语义信息,并且在各种NLP任务中表现出色。以下是目前主流的文本编码方法: 1. 基于预训练语…...

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …...

算法策略深度解析与实战应用

一、算法策略的本质与价值 算法策略是计算机科学的灵魂,它决定了问题解决的效率与质量。优秀的算法设计者就像战场上的指挥官,需要根据地形(问题特征)选择最佳战术(算法策略)。本文将深入剖析五大核心算法…...

【LeetCode 热题 100】3. 无重复字符的最长子串 | python 【中等】

美美超过管解 题目: 3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 注…...

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号,也即MAC地址,也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 (每一个数可以用四个…...

在 Docker 中,无法直接将外部多个端口映射到容器内部的同一个端口

Docker 的端口映射是一对一的,即一个外部端口只能映射到容器内部的一个端口。 1. 为什么不能多对一映射? 端口冲突: 如果外部多个端口映射到容器内部的同一个端口,Docker 无法区分外部请求应该转发到哪个内部端口,会…...

计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例

TCP与UDP区别 UDP:用户数据报协议,面向无连接,可以单播,多播,广播, 面向数据报,不可靠TCP:传输控制协议,面向连接的,可靠的,基于字节流&#xff…...

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包

用linuxdeployqt打包太麻烦,每次程序编译都要用linuxdeployqt打包一次,而且每次都要很长时间,通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件(只要没有增加新模块,只要用一次就可以) …...

【Python项目】基于深度学习的车辆特征分析系统

【Python项目】基于深度学习的车辆特征分析系统 技术简介:采用Python技术、MySQL数据库、卷积神经网络(CNN)等实现。 系统简介:该系统基于深度学习技术,特别是卷积神经网络(CNN),用…...

C++(初阶)(二)——类和对象

类和对象 类和对象类的定义格式访问限定符类域 实例化实例化概念内存对齐 this指针 类的定义 类(Class)是一种用于创建对象的蓝图或模板。它定义了对象(变量)的属性(数据)和方法(行为&#xff…...

JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作

个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS,JS,到底啥是JS有了解过吗?JS由哪几部分组成的呢? 定义: JavaScript是一种轻量级、解释型或即时编译型的编程语…...

ArcGIS操作:10 投影坐标系转地理坐标系

应用情景:在计算shp面质心坐标的时,由于需要的坐标是经纬度,所以需要将投影坐标系转化为地理坐标系 1、打开工具箱 2、右侧:数据管理工具 → 投影和变换 → 要素 → 投影 3、选择投影的数据、输出路径、地理坐标系,点…...

NVIDIA Jetson Nano的国产替代,基于算能BM1684X+FPGA+AI算力盒子,支持deepseek边缘部署

NVIDIA Jetson Nano的国产替代,基于算能BM1684X的AI算力盒子,支持deepseek边缘部署 另外,还提供BM1684XFPGAAI的解决方案。 核心板基于Sophon SG2300X SoC(也叫BM1684X)打造 带有8核ARM Cortex-A53 2.3GHz&#xff0c…...

c++全排列

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 个场…...

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南:打造极致高效的前端开发环境 一、基础环境配置:让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存(延迟1秒)"files.exclud…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...