简单聊聊如何更优雅地初始化对象:构造函数、Builder模式和静态工厂方法比较
大家好,我是G探险者。
在平时的java编程中,你肯定会有过对一些实体对象进行初始化的set操作,有的对象的属性较少可能还好点,当一个对象拥有许多属性时,通常的初始化方式可能显得笨拙而不直观,代码写的很不美观,我是有点难受了。
![]()
今天我们就来聊聊对象初始化属性的几种方式。
你可以使用构造函数、Builder模式或者静态工厂方法来更优雅地初始化对象的属性。下面我将为你介绍这三种方法:
1. 构造函数
构造函数可以在对象创建时直接初始化属性。你可以提供一个接受所有必要参数的构造函数,或者提供多个构造函数,以支持不同的初始化方式。
public class MyClass {private int property1;private String property2;// Other properties...public MyClass(int property1, String property2 /*, other parameters*/) {this.property1 = property1;this.property2 = property2;// Initialize other properties...}
}
2. Builder模式
Builder模式通过链式调用来设置属性,使代码更具可读性。
public class MyClass {private int property1;private String property2;// Other properties...private MyClass(Builder builder) {this.property1 = builder.property1;this.property2 = builder.property2;// Initialize other properties...}public static class Builder {private int property1;private String property2;// Other properties...public Builder property1(int property1) {this.property1 = property1;return this;}public Builder property2(String property2) {this.property2 = property2;return this;}// Methods to set other properties...public MyClass build() {return new MyClass(this);}}
}
使用Builder模式时,你可以这样创建对象:
MyClass obj = new MyClass.Builder().property1(10).property2("example")//.otherProperty(value).build();
3. 静态工厂方法
静态工厂方法可以返回已经初始化好的对象,避免了直接使用构造函数的繁琐。
public class MyClass {private int property1;private String property2;// Other properties...private MyClass(int property1, String property2 /*, other parameters*/) {this.property1 = property1;this.property2 = property2;// Initialize other properties...}public static MyClass createInstance(int property1, String property2 /*, other parameters*/) {return new MyClass(property1, property2 /*, other arguments*/);}
}
使用静态工厂方法时,你可以这样创建对象:
MyClass obj = MyClass.createInstance(10, "example");
以下是对构造函数、Builder模式和静态工厂方法的特点进行表格比较:
| 特点 | 构造函数 | Builder模式 | 静态工厂方法 |
|---|---|---|---|
| 直接初始化 | 是 | 是 | 是 |
| 参数顺序问题 | 可能存在 | 不存在 | 不存在 |
| 可读性 | 简单,直接 | 链式调用,可读性好 | 方法名提供明确的语义 |
| 复杂性 | 随着属性增多,构造函数参数列表可能变长 | Builder类增加了额外的复杂性 | 静态方法内部逻辑可能变得复杂 |
| 灵活性 | 需要提供多个构造函数以支持不同的初始化方式 | 可以设置默认值,支持不同的初始化方式 | 可以执行复杂的初始化逻辑 |
| 代码量 | 相对较少 | Builder类增加了额外的代码量 | 可能增加了额外的方法 |
| 适用场景 | 属性较少、简单的对象初始化 | 属性较多、需要多种初始化方式的对象 | 需要清晰的初始化语义或复杂初始化逻辑 |
4. 小结
选择合适的对象初始化方式取决于具体的需求和场景。构造函数适用于简单的对象初始化,Builder模式适用于属性较多或需要支持多种初始化方式的情况,而静态工厂方法则适用于需要清晰的初始化语义或者复杂初始化逻辑的场景。开发者可以根据项目需求选择最合适的初始化方式,以提高代码的可读性和可维护性。
通过本文的介绍,希望读者能够更加清晰地理解不同的对象初始化方式,并在实际开发中选择合适的方法来初始化对象,从而提高代码的质量和效率。
相关文章:
简单聊聊如何更优雅地初始化对象:构造函数、Builder模式和静态工厂方法比较
大家好,我是G探险者。 在平时的java编程中,你肯定会有过对一些实体对象进行初始化的set操作,有的对象的属性较少可能还好点,当一个对象拥有许多属性时,通常的初始化方式可能显得笨拙而不直观,代码写的很不…...
跳过mysql权限验证来修改密码-GPT纯享版
建议重新配置一遍,弄成功好多次了,每次都出bug,又要重新弄,不是过期就是又登不进去了,我服了 电脑配置MySQL环境(详细)这个哥们的10min配完,轻轻松松, 旧方法ÿ…...
Vue3快速上手(十七)Vue3之状态管理Pinia
一、简介 Pinia官网:https://pinia.vuejs.org/zh/ 从官网截图里可以直接看到,pinia是一个vuejs的状态(数据)管理工具。功能性同vuex。logo是小菠萝。它是一个集中式状态管理工具。就是将多个组件共用的数据管理起来,重复利用。有点类似缓存的意思。 二、Pinia环境搭建 …...
时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测
时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…...
学习笔记Day14:Linux下软件安装
软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器,类似应用商店 Conda < Miniconda < Anaconda(有交互界面) Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站ÿ…...
【CXL协议-事务层之CXL.io(3)】
3.1 CXL.io CXL.io 为 I/O 设备提供非一致的加载/存储接口。 图 14 显示了 CXL.io 事务层在 Flex Bus 分层结构中的位置。 交易类型、交易数据包格式、基于信用的流量控制、虚拟通道管理和交易排序规则遵循PCIe定义; 请参阅 有关详细信息,请参阅 PCI Ex…...
如何自己构建 Ollama 模型
如何自己构建 Ollama 模型 0. 引言1. 下载原始模型2. 创建 Modelfile 文件3. 构建 Ollama 模型4. 运行自构建的 Ollama 模型 0. 引言 针对模型新出的大模型,可能 Ollama Models Library 不提供,或者会在今后的某个时点提供。还有可能 Ollama Models Lib…...
5.84 BCC工具之tcpretrans.py解读
一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…...
从0到1实现RPC | 03 重载方法和参数类型转换
一、存在的问题 1.重载方法在当前的实现中还不支持,调用了会报错。 2.类型转换也还存在问题。 假设定义的接口如下,参数是float类型。 在Provider端接受到的是一个Double类型,这是因为web应用接收的请求后处理的类型。 在反射调用的时候就会…...
Matlab之已知2点绘制长度可定义的射线
目的:在笛卡尔坐标系中,已知两个点的位置,绘制过这两点的射线。同时射线的长度可以自定义。 一、函数的参数说明 输入参数: PointA:射线的起点; PointB:射线过的零一点; Length&…...
虚拟机安装Linux系统,FinalShell远程连接Linux
1.虚拟机安装CentOS系统 2. 查看CentOS系统的ip地址 3. FinalShell远程连接Linux 3.虚拟机快照(存档) 确保虚拟机关机,找到快照模拟器 恢复快照...
MacOS Xcode 使用LLDB调试Qt的 QString
环境: MacOS: 14.3Xcode: Version 15.0Qt:Qt 6.5.3 前言 Xcode 中显示 预览 QString 特别不方便, 而Qt官方的 lldb 脚本debugger/lldbbridge.py一直加载失败,其他第三方的脚本都 不兼容当前的 环境。所以自己研究写…...
C/C++代码性能优化——编程实践
1. 编程实践 在一些关键的地方,相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时,使用引用或指针,这样可以避免传递过程中发生拷贝。参数根据是否需要返回,相应加上const修饰,代码更安全&am…...
JVM—内存可见性
什么是可见性 可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JMM) Java内存模型(Java Memory Model)描述了Java程序中各种…...
VScode手动安装vsix格式插件,提示安装插件与code版本不兼容问题
问题描述: vscode手动按装插件提示"插件不兼容code版本 原因方案:修改安装包内的package.json文件中的版本号与vscode版本号对应即可 解决步骤 以(adpyke.codesnap-1.3.4.vsix)安装包为例 手动安装vscode弹出 无法安装扩展“adpyke.codesnap-1.3.4”,它与 …...
K8S Storage
概述 一般情况下,K8S中的Pod都不应该将数据持久化到Pod中,因为Pod可能被随时创建和删除(扩容或缩容),即便是StatefulSet或Operator的Pod,也都不建议在Pod里存放数据,可以将数据持久化到Host上。…...
Day54-nginx限速-访问日志-错误日志精讲
Day54-nginx限速-访问日志-错误日志精讲 测试请求限制连接限制(limit_conn)下载速度限制(limit_rate) ngx_http_core_module综合配置1.Nginx状态监控1.1 Nginx status介绍1.2 Nginx status配置1.3 基本状态数据如下所示:(注意本地…...
SQL经典面试题
这里写目录标题 1 背概念2 学例子 1 背概念 1 事务 事务是最小的不可在分的工作单元,事务的操作要么同时成功,要么同时失败。 ACID: 原子性、一致性、隔离性、持久性 2 约束 主键约束;外键约束(少用,会增加程序的耦合性ÿ…...
Java基础知识总结(14)
map集合 /* java.util.Map接口中常用的方法 1、Map和Collection 没有继承关系 2、Map集合以key和value的方式存储数据:键值对key和valuea都是引用数据类型key和value都是存储对象的内存地址key起到主导地位,value是key的一个附属品 3、Map接口中常用的方…...
MacOS - GCC 版本升级解决方案
Mac 中自带的 GCC 版本是 4.2.1,由于版本太低,在很多操作的时候会报错。因此需要对其进行升级,这里使用 Homebrew 来下载最新的 GCC。 安装 Homebrew MacOS 的终端中输入如下的命令来安装 Homebrew $ /usr/bin/ruby -e "$(curl -fsSL …...
多动症早期识别是什么?运动干预在儿童注意力缺陷中的作用是什么?
多动症早期识别如何影响儿童学习过程 多动症早期识别对儿童学习过程有着至关重要的影响。早期识别能够及时发现孩子在注意力集中方面的困难,并帮助教育工作者和家长采取有效应对措施。根据研究,注意力不集中可能导致学习成绩下降,影响孩子的自…...
BabelDOC企业级本地化部署实战:构建安全高效的文档翻译离线解决方案
BabelDOC企业级本地化部署实战:构建安全高效的文档翻译离线解决方案 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 在数据安全合规要求日益严格的今天,企业级文档翻译系…...
Oracle数据库中,将JSON字符串转换为多行数据
在Oracle数据库中,在将JSON字符串转换为多行数据时,通常可以使用JSON函数与一些SQL技巧来实现。下面是一些常见的方法来处理这个问题:方法1:使用JSON_TABLE函数JSON_TABLE 函数可以将JSON数组转换为关系表。例如,如果有…...
Audio Slicer终极指南:3步完成智能音频分割的免费工具
Audio Slicer终极指南:3步完成智能音频分割的免费工具 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer Audio Slicer是一款基于Python开发的…...
农村与中小城市的数字化,藏着被忽略的技术蓝海
被忽视的数字新大陆当一线城市的数字化转型趋于饱和,农村与中小城市正悄然成为技术落地的"价值洼地"。这片蓝海蕴藏着庞大的场景创新空间,却因基础设施薄弱、用户群体特殊、生态体系未成型等痛点被长期忽视。对软件测试从业者而言,…...
PDFtoPrinter:在.NET应用中实现高效PDF打印的终极解决方案
PDFtoPrinter:在.NET应用中实现高效PDF打印的终极解决方案 【免费下载链接】PDFtoPrinter .Net Wrapper over PDFtoPrinter util allows to print PDF files. 项目地址: https://gitcode.com/gh_mirrors/pd/PDFtoPrinter 你是否曾经在开发.NET应用时&#x…...
WarcraftHelper完全指南:让魔兽争霸III在现代系统重获新生
WarcraftHelper完全指南:让魔兽争霸III在现代系统重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸III在Wi…...
【绝密工作流】R 4.5下TCGA批量下载→准确定量→生存分析→可视化交付(全程无GUI,纯R脚本,含NCBI API密钥安全注入方案)
第一章:R 4.5基因测序数据分析教程概览R 4.5 版本引入了对 Bioconductor 3.19 的原生兼容性增强、更高效的稀疏矩阵处理能力,以及针对单细胞RNA-seq和ChIP-seq数据的底层内存优化。本教程面向具备基础R编程经验的生物信息学实践者,聚焦于从原…...
C++一维数组完全指南
一、什么是一维数组?用来一次性存储多个相同类型的数据内存中连续存放有统一的名字,用 ** 下标(索引)** 区分每个元素下标从 0 开始(非常重要)二、定义与初始化(四种常用方式)// 1. …...
LeetCode 删除无效的括号:python 题解诜
这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...
