Effective Java笔记(3)用私有构造器或者枚举类型强化 Singleton 属性

KVNAND架构:解决边缘设备部署LLM的内存与带宽挑战 大语言模型(LLM)在边缘设备部署时面临内存容量和带宽限制的核心挑战。传统方案依赖DRAM存储KV缓存,导致高昂成本和性能瓶颈。闪存计算(IFC)通过计算单元下沉和流水线优化缓解部分问题,但仍受限于DRAM依赖。KVNAND架构创新性地将KV缓存直接存储在3D NAND闪存中,结合异构计算和页面级KV映射技术,显著降低延迟和能耗。该架构特别适用于长上下文场景,如文档分析和个人助理应用,能有效解决内存溢出(OOM)问题并提升计算单元利用率。关键技术包括头组并行(HG)执行和混合键合设计,为边缘AI部署提供了新 阅读详情

        Singleton 是指仅仅被实例化一次的类 。Singleton 通常被用来代表一个无状态的对象,如函数,或者那些本质上唯一的系统组件 。 使类成为 Singleton会使它的害户端测试变得十分困难 ,因为不可能给 Singleton 替换模拟实现,除非实现一个充当其类型的接口 。

        实现 Singleton 有两种常见的方法 。 这两种方法都要保持构造器为私有的,并导出公有的静态成员,以便允许客户端能够访问该类的唯一实例 。 在第一种方法中,公有静态成员是个 final 域:

// Singleton with pubTic final field
public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... } 
    public void leaveTheBuilding() { ... }
}

        私有构造器仅被调用一次,用来实例化公有的静态 final 域 Elvis.INSTANCE 。由于缺少公有的或者受保护的构造器,所以保证了 Elvis 的全局唯一性:一旦 Elvis 类被实例化,将只会存在一个Elvis 实例 ,不多也不少 。 客户端的任何行为都不会改变这一点, 但要提醒一点:享有特权的客户端可以借助 AccessibleObject.setAccessible 方法,通过反射机制调用私有构造器 。 如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常 。

        在实现 Singleton 的第二种方法中,公有的成员是个静态工厂方法 :

// Singleton with static factory
public class Elvis {
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    pub1ic static Elvis getInstance() { return INSTANCE; }
    public void leaveTheBuilding() { ... }
}

        对于静态方法 Elvis.getinstance 的所有调用,都会返回同一个对象引用,所以,永远不会创建其他的 Elvis 实例(上述提醒依然适用) 。

        公有域方法的主要优势在于,API 很清楚地表明了这个类是一个 Singleton:公有的静态域是 final 的,所以该域总是包含相同的对象引用 。 第二个优势在于它更简单 。

        静态工厂方法的优势之一在于,它提供了灵活性:在不改变其 API 的前提下,我们可以改变该类是否应该为 Singleton 的想法 。 工厂方法返回该类的唯一实例,但是,它很容易被修改,比如改成为每个调用该方法的线程返回一个唯一的实例 。 第二个优势是, 如果应用程序需要,可以编写一个泛型 Singleton 工厂( generic singleton factory) 。使用静态工厂的最后一个优势是,可以通过方法引用( method reference )作为提供者,比如Elvis::instance 就是一个 Supplier<Elvis> 。 除非满足以上任意一种优势 ,否则还是优先考虑公有域( public -field )的方法 。

        为了将利用上述方法实现的 Singleton 类变成是可序列化的( Serializable ),仅仅在声明中加上 implements Serializable 是不够的 。 为了维护并保证 Singleton,必须声明所有实例域都是瞬时( transient )的,并提供一个 readResolve 方法(详见第四条)。否则,每次反序列化一个序列化的实例时,都会创建一个新的实例,比如,在我们的例子中,会导致“假冒的 Elvis”。 为了防止发生这种情况,要在 Elvis 类中加入如下 readResolve 方法:

// readResolve method to preserve singleton property
private Object readResolve() {
    // Return the one true Elvis and 1et the garbage collector
    // take care of the Elvis impersonator.
    return INSTANCE;
}

        实现 Singleton 的第三种方法是声明一个包含单个元素的枚举类型:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}

        这种方法在功能上与公有域方法相似,但更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候 。 虽然这种方法还没有广泛采用,但是单元素的枚举类型经常成为实现 Singleton 的最佳方法 。 注意,如果 Singleton必须扩展一个超类,而不是扩展 Enum 的时候,则不宜使用这个方法(虽然可以声明枚举去实现接口) 。

MATLAB与ROS联合仿真——实例程序搭建思路 阅读详情

相关推荐

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 285

《Effective Java》阅读笔记3 用私有构造器或者枚举类型强化Singleton属性

1.序 点击直达------->>>单例模式的正确使用方式 单例(singleton)指仅仅被实例化一次的类。单例对象通常表示无状态对象,如函数或本质上唯一的系统组件。使类成为单例会使测试它的客户端变得困难,因为不可能用模拟实现代替单例,除非它实现一个充当其类型的接口。 2. 静态成员方式 public class Singleton { public static final Singleton singleton = new Singleton(); private

weixin_41563161的博客 423

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

《Effective Java》学习笔记 - (3)用私有构造器或者枚举类型强化Singleton属性

Singleton是指仅仅被实例化一次的类,通常被用来代表一个无状态的对象,如函数,或者那些本质上唯一的系统组件。值得注意的是:如果一个类成为Singleton,那么这个类的客户端测试就会有点麻烦,因为不可能给Singleton替换模拟测试,除非实现一个充当其类型的接口。...

Jwasx的博客 279

VOLTE信令流程-IMS注册篇(五)

目录 VOLTE信令流程-IMS 注册 VOLTE信令流程-IMS 注册/注销 VOLTE信令流程-VoLTE呼叫流程 VoLTE-VoLTE VoLTE-CS CS-VoLTE CS-CS VOLTE信令流程 VOLTE信令流程-VOLTE-VOLTE信令 VOLTE信令流程-INVITE详细信息 VOLTE信令流程-eSRVCC信令流程 VOLTE信令流程-IP短信 VOLTE信令流程-IMS 注册 IMS注册流程简述  获取鉴权向量 IMS用户将注...

gender123的博客 2万+

久坐不慌,健康护航 —— 智能震动提醒坐垫的设计与实现

硬件核心:选用 ESP32 为主控,HX711 + 应变片实现精准压力检测,8050 三极管驱动震动马达,锂电池 + TP4056 满足便携供电需求;软件逻辑:核心是 “压力阈值判断 + 时间计时”,达到久坐阈值后触发震动提醒,流程图清晰体现了循环检测、状态重置的核心逻辑;代码特性:代码注释完善,阈值可灵活调整,支持串口调试,新手可直接编译烧录并根据实际场景校准。

weixin_42300449的博客 400

Effective Java学习笔记之第3条 用私有构造器或者枚举类型强化Singleton属性

第3条 用私有构造器或者枚举类型强化Singleton属性   Singleton指仅仅被实例化一次的类。Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。   方法一:   // Singleton with public final field   public class Elvis{     public static final Elvis...

weixin_30532369的博客 162

什么是 SAP Build Process Automation?

SAP Build Process Automation 是一款综合性的低代码工具,允许企业用户快速开发和自动化端到端业务流程。它整合了工作流管理、任务自动化和人工智能技术,提供了一个易于使用的平台,帮助企业更好地应对现代商业挑战。通过该工具,用户无需具备深厚的编程技能即可创建复杂的业务流程。例如,用户可以使用直观的拖放式界面设计流程、设置触发条件、定义任务分配规则,并通过内置的分析功能对流程效率进行评估。流程建模与设计:提供图形化界面,帮助用户直观地设计业务流程。任务自动化。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1259

读书笔记-《Effective Java》第3条、第4条: 强化Singleton属性—私有构造器或者枚举类型

第3条:用私有构造器或者枚举类型强化Singleton属性 把构造器私有这个是单例基本要求,本条介绍了一种不知道为啥没有流行起来的单例方式(实现Singleton的最佳方式),包含单个元素的枚举类型(INSTANCE不是关键字,写别的也行) package org.test; public enum People { INSTANCE; public String name ...

baitianmingdebai的专栏 220

MOS管驱动电路设计全攻略

MOS管驱动电路设计全攻略

让你爱上电路设计 3634

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1214

Effective Java笔记:用私有构造器或者枚举类型强化 Singleton 属性

是一个经典的设计模式和实践建议。Singleton(单例模式)是很常见的设计模式,用于确保一个类全局只有一个实例存在。很多早期的实现方式,比如懒加载的双重检查锁定,会出现线程安全问题。Singleton 模式确保某个类只有一个实例,并提供全局访问点访问它。懒汉式在第一次需要时实例化对象,可以节省内存,适合对象创建代价较高、使用频率较低的场景。对于单纯的全局实例管理(例如工具类、配置类),JVM 本身的强大枚举机制已经完全足够。饿汉式是在类加载时就创建好 Singleton 实例,以确保线程安全。

eclipseC的博客 934

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

《Effective Java》第三条:用私有构造器或者枚举类型强化Singleton属性

静态工厂方法将 “实例创建逻辑” 封装在方法内部,若未来需要修改 “是否返回单例”(如改为池化实例、按需创建),只需修改方法实现,无需改变对外暴露的 API(方法名、参数、返回值),现有调用代码无需调整。单例的核心是 “唯一实例的访问入口”,而直接暴露变量,本质是 “把实例当工具类的静态变量用”,无法引导开发者形成 “通过统一入口获取实例” 的习惯。是 “行为入口”,天然传递 “获取实例” 的动作 —— 它暗示 “这个类是有状态的实例类,不是无状态的工具类”,避免了对 “变量性质” 的误解。

papilon_的博客 1001

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Effective第三版 中英 | 第2章 创建和销毁对象 | 用私有构造器或者枚举类型强化 Singleton 属性

大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记,代码分享出来,供大家学习交流,如若笔记中有不对的地方,那一定是当时我的理解还不够,希望你能及时提出。前人述备矣,我只是知识的搬运工,effective 书籍源码均在开源项目 java-diary 中的 code-effective-third 模块中源代码仓库地址: https://gitee.com/Rocky-BCRJ/java-diary.git。

qq_42605751的博客 473

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java:Effective java学习笔记之 用私有构造器或者枚举类型强化SIngleton属性

Java 强化SIngleton属性强化SIngleton属性参考 强化SIngleton属性 参考 1、3、用私有构造器或者枚举类型强化SIngleton属性 2、《Effective Java》阅读笔记3 用私有构造器或者枚举类型强化Singleton属性 3、第三条:用私有构造器或者枚举类型强化Singleton属性 ...

JMW1407的博客 407

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Effective Java 创建和销毁对象 3.用私用构造器或者枚举类型强化Singleton属性

Effective Java 创建和销毁对象 3.用私用构造器或者枚举类型强化Singleton属性

yancyang的博客 2万+

鸡爪读Effective Java记录3:用私有构造器或者枚举类型强化Singleton属性

小鸡爪读Effective Java记录3:用私有构造器或者枚举类型强化Singleton属性----单例模式

weixin_44339617的博客 241

《Effective Java》第2章 第3条:用私有构造器或者枚举类型强化Singleton属性

首先,文章解释了 Singleton 模式的背景和用途。Singleton 是一种创建类的设计模式,它确保一个类只有一个实例,并提供全局访问点。在许多场景下,只需一个实例即可满足需求,比如线程池、缓存、数据库连接等,这时使用 Singleton 可以减少资源开销。接着,文章介绍了两种实现 Singleton 的方式。

weixin_36639192的博客 467

一文读懂《Effective Java》第3条:用私有构造器或者枚举类型强化Singleton属性

点击上方蓝字关注我们Singleton 指仅仅被实例化一的类,通常用于代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。使类成为Singleton 会使它的客户端测试变得困难,因...

Diligence is the mother of success. 283

《Effective Java》第3条:用私有构造器或者枚举类型强化 Singleton 属性

原文P15:这种方法在功能上与公有域方法相似,但更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。这类对象的多个实例之间没有差异——无论创建多少个,它们的功能完全一致,此时重复创建实例只会浪费内存资源,如 StringUtils 字符串处理工具,就是单例的,可以看源码,发现 StringUtils 类中除了构造方法外,其他所有方法都是 static 的,也就是说是单例的。好处就是,简化代码,提高可读性,延迟执行等等。②公有的静态成员是个静态工厂方法;

TD_FAlmK的博客 606

Effective Java3.3-用私有构造器或者枚举类型强化 Singleton 属性

3 用私有构造器或者枚举类型强化 Singleton 属性 主要内容:讲述了如果需要使用singleton,可以通过公有静态成员/公有静态工厂方法/单元素的枚举类型实现。 主要目标:判断singleton是否需要继承一个超类,如果不需要,优先考虑使用枚举类型来创建。 实际应用场景:暂无考虑到 Effective Java知识点摘录+白话说明 实现 singleton有两种常见的方法,这两种方法都要保持构造器为私有的,并导出公有的静态成员,以便允许客户端能够访问该类的唯一实例。在第一种方法中,公有静态

JunxuanBo 235

Effective Java:第三条--用私有构造器或者枚举类型强化 Singleton 属性

摘要: Singleton类确保全局唯一实例,适用于日志记录器、连接池等场景。现代框架(如Spring)已内置单例管理,减少了手动实现需求。实现方式包括:1) 公有静态final域,简单但需处理反射和序列化;2) 静态工厂方法,灵活性更高,支持泛型;3) 枚举实现(推荐),天然线程安全、防反射攻击且代码简洁。对比显示枚举方式综合优势明显,仅继承场景需选择其他方法。在Spring Boot等框架中,容器管理的Bean已默认实现单例,通常无需手动编写。

m0_46557728的博客 812

跟我学(Effective Java 2)第3条:用私有的构造器或者枚举类型强化单例模式(Singleton)属性

Singleton指仅仅被实例化一次的类。Singleton通常会被用来本质上唯一的系统组件,比如窗口管理器或者文件系统。使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口。 实现Singleton的两种方法,这两种方法都要把构造器保持为私有的,并导出公有的静态成员,以便允许客户端能够访问该类的唯一实例。在第一种方法中...

Dullon_jiang的博客 232

Effective Java——用私有构造器或者枚举类型强化Singleton属性

Singleton指仅仅被实例化一次的类 [Gamma95]。Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件。使类称为Singleton会使它的客户端测试变得十分困难,因为除非它实现了作为其类型的接口,否则不可能将模拟实现替换为单例。   实现单例的方法有两种。 两者都基于保持构造函数私有并导出公共静态成员以提供对唯一实例的访问。 在一种方法中,该成员是final字段: // Singleton with public final field public cla

菜园子丶For丨丶Tomorrow的博客 228

Effective Java解析与精简:用私有构造器或者枚举类型强化Singleton属性(第3条)

本文探讨了实现单例模式的多种方法。主要内容包括:1)通过私有构造器和静态final字段实现单例;2)使用静态工厂方法增强灵活性;3)推荐使用枚举类型实现单例,因其具有线程安全、防止反射攻击和自动处理序列化等优势。此外,文章还介绍了多线程环境下的单例实现方案,包括双重校验锁、静态内部类和即时初始化等方法。其中枚举方式最为推荐,能完美解决反射、序列化和线程安全问题,代码也最为简洁。其他方法各有优缺点,需要根据具体场景选择。

Cosmoshhhyyy的博客 420
上一篇: Effective Java笔记(2)遇到多个构造器参数时要考虑使用构建器
下一篇: Effective Java笔记(5)优先考虑依赖注入来引用资源
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值