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

解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录

  • 【前言】欢迎订阅【解读《Effective Java》】系列专栏
  • java.lang.Math 类的设计
  • 经验总结

【前言】欢迎订阅【解读《Effective Java》】系列专栏

《Effective Java》是 Java 开发领域的经典著作,作者 Joshua Bloch 以丰富的经验和深入的知识,全面探讨了 Java 编程中的最佳实践。这本书被公认为 Java 开发者的必读经典,对提升编码技巧和代码质量具有重要意义。

在《Effective Java》中,Bloch 总结了 Java 编程的精髓,涵盖了从对象创建和销毁,到类和接口设计,再到泛型、枚举和并发编程的方方面面。每一条法则不仅是对具体问题的解决方案,更是经验的凝练,旨在帮助开发者编写更高效、可维护且健壮的代码。

为了帮助大家更好地理解和应用这些编程原则,我们推出了【解读《Effective Java》】系列专栏。在这里,我们将逐条解读《Effective Java》第三版中的90条编程法则。每篇文章将详细总结和分析法则,结合实际代码示例和应用场景,帮助您将理论知识转化为实际编程能力。

适合人群:

  • Java 初学者:掌握 Java 编程的核心原则和最佳实践。
  • 中级开发者:获取深入见解和高级技巧,提升编码能力。
  • 资深工程师:优化和重构现有代码,提升开发效率。

敬请关注我们的专栏,与我们一起深入探索 Java 编程的精髓,提升您的编码技能。感谢您的订阅与支持,我们期待与您共同踏上这段充满知识和启发的编程之旅!

感谢您的订阅:解读《Effective Java》


java.lang.Math 类的设计

《Effective Java》第三版中的第4条是“通过私有构造器强化不可实例化的能力”。其主要目的是防止类被实例化,从而保证该类只能用于提供静态方法或字段。这个设计模式常用于工具类,比如 java.lang.Math 类,因为这些类的实例化没有实际意义,同时避免潜在的错误和不必要的资源开销。

java.lang.Math 类为例,Math 类是一个工具类,类中的方法,例如 sqrt(), pow(), max() 等,都是静态方法。这意味着它们可以直接通过类名访问,而无需创建类的实例。例如:

double result = Math.sqrt(16.0);

这些静态方法提供了类的所有功能,不需要实例化类来调用它们,所以 Math 类的实例化没有任何意义,这也是 Math 类的设计目的:提供工具方法而非对象实例

为了确保 Math 类不能被实例化,Java 标准库的设计者遵循了以下实践:

public final class Math {// Don't let anyone instantiate this class.private Math() {}// Static methodspublic static double sqrt(double a) {// Implementation}// Other methods...
}

public final classMath 类被声明为 final,这意味着它不能被继承。这个设计防止了其他类对 Math 类进行扩展,从而保持了类的完整性。

在 Java 中,当类不包含显式的构造器时,编译器会生成默认的空参构造器,因此我们需要提供一个默认的空参构造器,并声明为 private,使得外部无法访问,该类也就无法被实例化:

private Math() {}

为了防止有人使用不正当的方式尝试实例化 Math 类,我们可以在私有构造器中抛出 AssertionError 异常,这样当调用构造器进行实例化时调用者就会收到明确的错误信息:

private Math() {throw new AssertionError("Cannot instantiate Math");
}

除了抛出异常,我们还可以添加类似的醒目注释:Don't let anyone instantiate this class.,向使用者提醒该类的设计意图:

// Don't let anyone instantiate this class.
private Math() {}

经验总结

因此,当我们需要设计一个仅用于提供工具方法的工具类时,可以参考java.lang.Math类,尝试使用静态方法提供类的所有功能,这样不需要通过实例化来调用;再将构造器设置为 private,防止类的无效实例化,还避免了资源浪费和潜在的设计错误。

相关文章:

解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【解读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【解读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作,作者 Joshua Bloch 以丰富的经验和深入的知识,全面…...

Vivado HLS学习

视频链接: 6课:数据类型的转换_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bt41187RW?spm_id_from333.788.videopod.episodes&vd_sourcea75d5585c5297210add71187236ec90b&p6 目录 1.数据类型的转换 2.自动类型转换 2.1隐式数据转换 2.2…...

一款AutoXJS现代化美观的日志模块AxpLogger

简介 Axp Logger是一款基于autox.js的现代化日志模块,具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式(不影响脚本运行)监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…...

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代,抖音电商以其独特的魅力迅速崛起,成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中,成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力,成为了众多商家信赖的合…...

Spark的安装配置及集群搭建

Spark的本地安装配置&#xff1a; 我们用scala语言编写和操作spark&#xff0c;所以先要完成scala的环境配置 1、先完成Scala的环境搭建 下载Scala插件&#xff0c;创建一个Maven项目&#xff0c;导入Scala依赖和插件 scala依赖 <dependency><groupId>org.scal…...

网络编程基础-IO模型深入理解

一、IO的基本概念 什么是IO&#xff1f; I/O就是计算机内存与外部设备之间拷贝数据的过程 什么是网络IO&#xff1f; 网络IO是指在计算机网络环境中进行的输入和输出操作&#xff0c;涉及数据在网络设备之间的传输。 网络IO操作可以是发送请求、接收响应、下载文件、传输数…...

go 语言学习路线图(一)

1. Go语言简介 Go语言的历史背景和设计理念Go的优势&#xff1a;简洁、高效、并发支持强Go的应用场景&#xff1a;微服务、云计算、系统编程 2. 开发环境设置 安装Go语言开发环境 在Windows、macOS、Linux系统上的安装方法 配置环境变量&#xff1a;GOROOT 和 GOPATH验证安装…...

前端自动化部署,Netlify免费满足你

1 Netlify 介绍 为什么推荐 Netliy &#xff0c; 主要还是穷&#xff0c;Netlify 免费太香了 Netlify you优势100GB 内免费 &#xff0c;满足个人日常 需求&#xff0c;操作,兼容性绑定代码仓库&#xff0c;提交代码自动部署 支持 github , gitlab 等 大多常用代码仓库易操作只…...

Linux的开发工具gcc Makefile gdb的学习

一&#xff1a;gcc/g 1. 1 背景知识 1. 预处理&#xff08;进行宏替换) 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结…...

基于SSM出租车管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;车辆管理&#xff0c;驾驶员管理&#xff0c;基础数据管理&#xff0c;公告管理 驾驶员账号功能包括&#xff1a;系统首页&#xff0c;学生管理&#xff0c;车辆管理&#xff0c;公告管理 开发系统&a…...

iPhone照片内存怎么清理,参考这些方法

随着拍摄数量的增加&#xff0c;许多iPhone用户常常发现自己的手机存储空间不足&#xff0c;而照片无疑是占用空间的罪魁祸首之一。清理这些照片不仅能释放存储空间&#xff0c;还能提升设备的运行速度。小编将分享一些iPhone照片内存怎么清理的高效策略&#xff0c;助你告别冗…...

【Triton教程】向量相加

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境&#xff0c;以高效编写自定义 DNN 计算内核&#xff0c;并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 在本教程中&#xff0c;你将使…...

关于CSS中毛玻璃和滤镜使用总结

【1】毛玻璃 毛玻璃效果&#xff08;也称为磨砂玻璃效果&#xff09;可以通过 CSS 的 backdrop-filter 属性来实现。这个属性允许你在背景上应用各种滤镜效果&#xff0c;从而创建出类似磨砂玻璃的效果。这种效果通常用于创建半透明背景下的模糊效果&#xff0c;使得背景图像或…...

陷入产出危机的我聊聊近况

文章目录 前言我的多重身份作为IT网管作为运维人员作为Web开发人员作为游戏开发人员 总结 前言 在总结文章时&#xff0c;我把自己当做一个内容产出者&#xff0c;当这样一个身份进入每天按部就班的平稳状态时会陷入一种焦虑&#xff0c;产生一种居然没有什么可写的感觉&#…...

HarmonyOS 开发知识总结

1. HarmonyOS 开发知识总结 1.1. resources->base->media中不可以新建文件夹&#xff1f; 项目图片路径resources->base->media中不可以新建文件夹&#xff0c;图片全平级放里面&#xff0c;查找图片不方便&#xff0c;有没有什么其他的办法解决这个难点&#xff…...

[WPF初学到大神] 1. 什么是WPF, MVVM框架, XAML?

什么是WPF? WPF(Windows Presentation Foundation) 包含XAML标记语言和后端代码来开发桌面应用程序的. 用VS新建项目有WPF(.Net Framework和.Net应用程序), 该怎么选? 首选 .NET 应用程序(.NET Core 或 .NET 5/6/7/8新版本)拥有更好的性能、跨平台Windows, Linux, Mac支…...

matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据

在使用MATLAB批量处理数据时&#xff0c;有时候需要自动搜索文件夹中的所有txt文件&#xff0c;并将每个txt文件中的数据存放到一个以一定规律命名的变量中&#xff0c;以便于后续通过循环处理每个变量数据。 然而&#xff0c;MATLAB并不支持在变量名中直接使用i来动态生成变量…...

LabVIEW智能可变温循环PCT测试系统

随着全球能源危机的加剧和环境保护需求的提升&#xff0c;开发和利用清洁能源已成为全球必然趋势。氢能作为一种高效的替代能源&#xff0c;正逐步受到关注。然而&#xff0c;储氢技术的研究至关重要&#xff0c;尤其是储氢材料的PCT&#xff08;Pressure-Composition-Temperat…...

SparkSQL整合Hive

spark-sql可以直接使用hive的元数据 1、环境搭建如下&#xff1a; ## 1、启动hive的元数据服务shell # 1、修改hive的配置文件 cd /usr/local/soft/hive-3.1.3/conf# 2、增加配置 vim hive-site.xml<property> <name>hive.metastore.uris</name> <value…...

Vue 3 和 Vue 2区别

Vue 3 是 Vue 2 的全新升级版本&#xff0c;引入了诸多新的特性&#xff0c;并在性能、开发体验、响应式系统等多个方面进行了改进。以下是 Vue 2 和 Vue 3 的详细对比&#xff1a; 1. 生命周期钩子差异 Vue 3 保留了大部分 Vue 2 的生命周期钩子&#xff0c;但部分名称有所调…...

智慧校园厂家怎么选?看懂这 5 个核心功能再决定不迟

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

Rancher国内网络卡脖子?手把手教你配置私有镜像仓库(避坑RKE2 registries.yaml)

Rancher国内网络优化实战&#xff1a;私有镜像仓库配置全指南 引言 对于国内Kubernetes从业者来说&#xff0c;Rancher无疑是一款强大的集群管理工具。但在实际部署过程中&#xff0c;许多团队都遇到过因网络问题导致镜像拉取失败的困扰。想象一下&#xff0c;当你正准备部署一…...

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾遇到这样的尴尬场景&#xff1a;购买了心仪的PS4或PS5手柄&#xff0c;想在PC上畅…...

从Hyper-V到内核隔离:手把手教你为eNSP在Win11 24H2上‘清场’(安全功能关闭指南)

从Hyper-V到内核隔离&#xff1a;Win11 24H2深度虚拟化冲突解决手册 当你在Windows 11 24H2上启动eNSP模拟器时&#xff0c;那个令人沮丧的"版本不兼容"提示背后&#xff0c;隐藏着一场现代系统安全机制与传统虚拟化工具的无声战争。这不是简单的软件冲突&#xff0c…...

如何高效构建Steam游戏DRM解除自动化解决方案:开源框架技术实现

如何高效构建Steam游戏DRM解除自动化解决方案&#xff1a;开源框架技术实现 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam游戏DRM解除自动化解决方案为技术爱好者提供了一套完整…...

akdbdudhdhfvf

一、OpenAI 1.OpenAI是什么简单来说&#xff0c;OpenAI 大模型 是由美国人工智能公司 OpenAI 开发的一系列大型语言模型&#xff08;LLMs&#xff09; 。你可以把它们想象成拥有巨大“知识储备”和“学习能力”的超级大脑&#xff0c;它们被训练用来理解和生成人类语言&#xf…...

Vivado DDS IP核的‘光栅化’模式详解:告别相位噪声,提升信号纯度的秘密

Vivado DDS IP核的‘光栅化’模式深度解析&#xff1a;高纯度信号生成的工程实践 在FPGA数字信号处理领域&#xff0c;直接数字频率合成&#xff08;DDS&#xff09;技术因其频率分辨率高、切换速度快等优势&#xff0c;已成为雷达系统、通信设备和测试仪器中的核心模块。Xilin…...

2025届毕业生推荐的降重复率方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 学术写作以及论文发表进程里&#xff0c;查重之后的降重处置是关键一环&#xff0c;当下市面…...

APM基础概念普及:应用性能管理的全面解析

在当今数字化时代&#xff0c;企业应用的性能直接影响着用户体验和商业成功。应用性能管理&#xff08;Application Performance Management&#xff0c;APM&#xff09;作为保障应用稳定运行的关键技术&#xff0c;已成为现代IT运维不可或缺的工具。本文将全面解析APM的基础概…...

Sunshine游戏串流平台:免费开源的自托管游戏串流完整指南

Sunshine游戏串流平台&#xff1a;免费开源的自托管游戏串流完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏大作&#xff1f;Sunshine开源游戏…...