用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)

《effective java 》第3条--枚举类型实现单例模式 枚举方式(推荐) 创建枚举默认就是线程安全的,所以不需要担心double checked locking,而且还能防止反序列化导致重新创建新的对象。保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量)。 public class Singleton { public static void main(String[] args) { Single sin... 阅读详情

 我们常用的构造单例模式(Singleton)的方法,一般有2种

1 提供一个静态的公共属性
2 提供一个静态的公共方法

这2个方法,都是采用了私有的构造器来防止外部直接构造实例。 但我们可以用反射的方法,获得多个实例。后面我会给出测试的代码。

从1.5开始,枚举也可以用来获得单例,而且更加可靠。同时又自动提供了一些额外的功能。

先看看测试代码:


测试结果
TestSingleton1@c17164/TestSingleton1@1fb8ee3
false
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at TestSingleton.testSingleton2(TestSingleton.java:43)
at TestSingleton.main(TestSingleton.java:11)
Caused by: java.lang.RuntimeException: 实例只能建造一次
at TestSingleton2.<init>(TestSingleton.java:103)
... 6 more
java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:511)
at TestSingleton.testSingleton3(TestSingleton.java:61)
at TestSingleton.main(TestSingleton.java:12)


小结:可见,只有第三种枚举的方法才是最安全的。

关于里面提到的,在序列化是可能出现的问题,我看以后在讨论吧。不过因为枚举实现的单例没有这个问题,所以我看以后就用枚举好了,何必自己跟自己过不去呢?

Fortify SCA 24.4 最新可用版 Fortify Static Code Analyzer(Fortify SCA) 是一款由 Micro Focus(原惠普旗下)开发的 静态应用安全测试(SAST)工具,专注于在软件开发早期通过分析源代码或编译后的二进制文件,识别潜在的安全漏洞、代码缺陷和合规性问题。以下是其核心特点与功能:核心功能 静态代码分析 在不运行程序的情况下,通过语法、语义分析检测代码中的安全漏洞(如 SQL 注入、跨站脚本(XSS)、缓冲区溢出等)和代码质量问题。 阅读详情

相关推荐

OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢! ==================================================================================源码

晨宇思远 5万+

effective java 第3条 枚举与单例模式

Enum类比于Class 很像的 见下图 像吧 然后看下面这段话: 实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类型而且该类继承自java.lang.Enum类 枚举不能被继承,可以实现接口 values() 以数组形式返回[a,b] valueof(“a”) 返回 a 单例模式中的枚举实现 饿汉模式: public class Singleto

D_XQY_的博客 535

研一小白投稿SCI:Applied Intelligence从提交到Under Review的保姆级避坑指南

本文为研一学生提供Applied Intelligence期刊投稿的详细指南,涵盖格式校验、状态解析及审稿回应策略。特别强调声明文件、LaTeX模板的常见错误及应对方法,帮助新手避开高频踩坑点,提升投稿成功率。

weixin_29230805的博客 497

Effective Java第二版笔记之使用私有构造器或枚举实现单例

什么是单例 单例是指只会初始化一次,因而最多只会有一个实例的类。单例一般用来表示本质上只有一个的组件。比如操作系统中的窗体管理器和文件系统等。 单例类具备哪些要求 在使用单例时,需要考虑以下几点: 访问权限控制,应当使用私有属性或方法生成实例 反射攻击(防止通过反射调用私有属性或方法,生成新的实例) 反序列化问题(防止多次反序列化生成多个不同的实例) 线程安全(防止不同线程生成多个不同的实例) 是否使用延迟加载,只在需要的时候才生成实例 如果不考虑延迟加载的问题,枚举是实现单例的最佳选择。 下面以一个完

谈谈IT 225

国科大学习资料--机器人智能控制_袁如意老师PPT后习题答案(学长精心整理)

人工神经元激活函数的作用是什么? 答:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。 人工神经网络的学习规则有哪些?各有何特征? 答:大类可以分为无监督学习算法、有监督学习算法和强化学习。其中无监督学习算法指只有输入信息,没有期望的输出信息,如Hebb学习规则,神经元连接强度的变化与两个相互连接的神经元的激活水平成正比。竞争学习法则:网络各输出单元相互竞争,最后达到只有一个最强者激活。有监督学习算法指同时提供输入信息和对应的期望输出信息,如误差学习(Delta学

无名何许人的博客 1488

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 968

Effective Java 第二版 中文版 笔记(三)枚举实现单例模式

 枚举实现单例模式: public enum DataSourceEnum { DATASOURCE; private DBConnection connection = null; private DataSourceEnum() { connection = new DBConnection(); } public DBConnect...

qq_37538698的博客 680

python基础知识补充

1. jupyter notebook 解释 2. ipython 魔法命令 3. latex in Markdown cell(在markdown里面编写数学公式) 4. jupyter notebook功能扩展:安装Nbextension 5. python解释与运行 6. 垃圾回收(计数机制与分代回收机制) 7. 名字空间与局部作用域L和全局作用域G 8. 小整数缓存区与字符驻留 9. Statement &Expression 10. 调试

weixin_43178406的博客 1万+

Effective Java --通过枚举enum实现单例设计

Effective Java --通过枚举enum实现单例设计 最近在看Effective Java,记录下之后编码时可以注意的一些习惯,提高编码质量 每提高一点都是积累 通过枚举enum实现单例设计 实现枚举类 枚举中的属性必须放在最前面,一般使用大写字母表示 枚举中可以和java类一样定义方法 枚举中的构造方法必须是私有的 通过枚举来实现单例 实现单例的核心在于privat...

jtf8525140的专栏 475

Open3D(C++) 基于RANSAC和TLS的点云平面拟合

针对点云平面拟合过程中出现的异常值及误差的问题,提出一种将随机采样一致算法(RANSAC)与整体最小二乘法(TLS)相结合的点云平面拟合方法。利用随机采样一致算法剔除异常值,利用整体最小二乘法对剩余有效点进行平面拟合,计算模型参数。实验结果表明,该方法与传统的特征值法、最小二乘法相比,能提高参数的估算精度,更适合对含有不同异常值及误差的点云数据进行拟合,是一种稳健的平面拟合方法。

点云侠的博客 431

睿抗机器人魔力元宝在完成任务过程中如何使机械臂先到达白色盒子上方而不是先到达工作台?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1379

用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得 三

用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得 三

jgfyyfd的博客 322

华为OD机试真题 新系统 - WIFI设备网络规划 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2017

《Effective Java中文版》第二版 读书笔记

     《Effective java》第二版基于Jdk1.5,虽然现在最新的jdk是jdk10,但书中内容主要介绍的是Java的一些编程规范、java编程思想,所以依然值得大家去读,可供大家学习的地方还很多。以下是自己对这本书的一些总结,由于篇幅原因,只做简单介绍,让大家知道有这么一个概念。    正如书的引言所说,本书的目的是帮助读者最有效地使用Java程序设计语言及其基本类库:java.l...

言必信,行必果 1202

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Effective Java读书笔记(三):泛型、枚举、注解、异常

来到读书笔记的第三篇了,这一次的主题是讲泛型、枚举、注解这三个Java1.5引入的语言特性。关于泛型,很久以前我写过一篇初识的文章,http://blog.youkuaiyun.com/leelit/article/details/39504873,里面的一些基础知识现在看起来依然能起到复习作用。而另外两个特性的基础知识这里不再展开,因为Effective Java这本书讲的就是一些编程技巧或者说良好的习惯。然

leelit笔记本 1168

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Effective java第二版读书笔记

下面对Effective java第二版中的技术点进行总结 技巧 优点 缺点及注意事项 用静态工厂方法代替构造器 有名称, 不必在每次调用时都创建一个新对象,可返回原返回类型的任何子类型对象,创建参数化实例时,代码更简洁 若类不含有公有或受保护的构造器,不能被子类化,它们与其他静态方法实际上没有任何区别 多个构造器参数时考虑用构造器 Builder模式,利用所有必要的参

smileiam的专栏 1923

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Effective Java读书笔记——第六章 枚举和注解

JDK1.5中加入一种新的类——枚举类型、一种新的接口——注解类型。第30条:用enum代替int枚举类型是指由一组固定的常量组成合法值的类型。例如一年中的季节、太阳系智能柜的行星或一副牌中的花色。在枚举类型出现之前,表示枚举类型的模式是使用一组具名的int常量://JDK1.5之前的老式写法 public static final int APPLE_FUJI = 0; public static

vanpersie_9987的博客 649

《Effective Java》读书笔记五

一、标记接口的作用类型标识:标记接口用于标识一个类具有特定的属性或行为特征,为程序提供一种类型信息,以便在运行时进行类型检查和特定的处理。实现多态:可以基于标记接口实现多态性,使得不同的类可以以统一的方式被处理,增强了代码的灵活性和可扩展性。二、与其他方式的比较相对于注释:标记接口是一种强类型的方式,编译器可以进行严格的类型检查,而注释只是一种元数据,不能提供同样的类型安全性。

qq_41831136的博客 726

单例模式的一些文章

单例模式的七种写法:http://cantellow.iteye.com/blog/838473 用枚举来实现单例模式:http://www.cnblogs.com/macula7/archive/2010/03/19/1960490.html 用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三):http://blog.youkuaiyun.com/jav...

iteye_19584的博客 148

Effective-Java读书笔记【第六章上 枚举】

第六章上 枚举 第三十条 考虑用静态工厂方法代替构造器 枚举类型是继承自抽象类Enum的抽象类,枚举值是继承自枚举类型的匿名实现类。 public enum Operation { PLUS("+") { double apply(double x, double y) { return x + y;}}, MINUS("-") { double apply(doub

徐徐如生 349

Effective Java读书笔记-17

如果事先没有认真考虑默认的序列化形式是否合适,则不要贸然接受。如果一个对象的物理表示法等同于它的逻辑内容,可能就适合于使用默认的序列化形式。即使你确定了默认的序列化形式是合适的,通常还必须提供一个readobject方法以保证约束关系和安全性。它使这个类的导出APl永远地束缚在该类的内部表示法上。它会消耗过多的空间。它会消耗过多的时间。它可能导致堆栈溢出。在决定将一个域做成非瞬时的之前,请一定要确信它的值将是该对象逻辑状态的一部分。

weixin_42583701的博客 1339

Effective Java读书笔记-9

在枚举类型中声明一个抽象的apply方法,并在特定于常量的类主体(constant-specific class body)中,用具体的方法覆盖每个常量的抽象apply方法。例如声明参数的类型为Apple,它就能保证传到该参数上的任何非空的对象引用一定属于三个有效的Apple值之一,而其他任何试图传递类型错误的值都会导致编译时错误,就像试图将某种枚举类型的表达式赋给另一种枚举类型的变量,或者试图利用==操作符比较不同枚举类型的值都会导致编译时错误。枚举天生就是不可变的,因此所有的域都应该为final的。

weixin_42583701的博客 139

【 Effective java】第6章 读书笔记

第6章 枚举和注解 34,用 enum 代替 int 常量 int 枚举是编译时常量。 String 枚举模式。 枚举模式:枚举类型是实例可控的,它们是单例的泛型化,本质上是单元素的枚举。 枚举类型保证了编译时类型安全。 为了将数据与枚举常量关联起来,需要声明实例域,并编写一个带有数据并将数据保存在域中的构造器。 策略枚举: 枚举中的 switch 语句适合于给外部的枚举类型增加特定于常量的行为。 什么时候用到枚举: 每当需要一组固定常量,并且在编译时就知道其成员的时候,就应该用枚举。 枚举类型的常量集并不

qq_45050687的博客 128

《Effective java 第2版》读书笔记--泛型与枚举

第五章 泛型 第二十三条:不要在新代码中使用原生态类型1.泛型的原生态类型:List对应的是不带任何实际参数类型的List2.泛型的优点:(1)插入元素时自带类型检查(2)删除元素是不需要进行手工转换(3)可以使用for-each循环,两种方法3.缺点(1)使用原生态类型,会失掉泛型在安全性和表述性方面所有的优势(2)List与List的区别:前者可以接受List,但是后者不行(3)不确定类型的时

白夜行 717

Effective Java读书笔记-2

否则,每次反序列化一个序列化的实例时,都会创建一个新的实例,比如,在上述的例子中,会导致"假冒的Elvis"。然而在缺少显式构造器的情况下,编译器会自动提供一个公有的无参的缺省构造器( default constructor)对于用户而言,这个构造器与其他的构造器没有任何区别。此外,可能还需要用特殊的词典进行测试。由于显式的构造器是私有的,所以不可以在该类的外部访问它。实现Singleton有两种常见的方法,这两种方法都要保持构造器为私有的,并导出公有的静态成员,以便允许客户端能够访问该类的唯一实例。

weixin_42583701的博客 181

Effective java读书笔记

第一章节1)利用静态工厂方法代替构造器//com.insanus.OldNews.java package com.insanus; public class OldNews { //private static OldNews object = null; private OldNews() { } public static OldNews createOldNe

insanus的博客 260
上一篇: 做程序其实可痛苦的了......
下一篇: 程序员提高建议之踏踏实实“扎马步”
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值