首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么说“单元素枚举类型已经成为实现Singleton最佳方法”

预计阅读时间:10分钟 Joshua Bloch大神Effective Java明确表达过观点:使用枚举实现单例方法虽然还没有广泛采用,但是单元素枚举类型已经成为实现Singleton...有,可以使用枚举方式,Joshua Bloch大神也Effective Java明确支持此种方式,如下: public enum Singleton { INSTANCE;...不止简单,还成功避免了上述问题,而且能保证反序列化时候不会生成新实例对象,以下是枚举方式反编译(使用javap命令)字节码: javap Singleton.class Compiled from...如上,会报错,而且目前没有任何方法能绕过该限制,以下是jdknewInstance方法源代码,如果是ENUM类型则不允许使用反射(红色标注部分),看到这里大家应该明白为什么枚举方式能保证单例实例安全...这种方式是Effective Java作者Josh Bloch 大神提倡方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新对象,所以极力大家写单例时使用此种方式 End

1.2K40

和 lvgo 一起学设计模式(一)创建型之单例模式

,而这个音效大小有50M(假设),加载一次需要 2s ?左右时间。你测试过程中发现,每次人物?‍...扯远了,我们要谈还是单例问题。缓存内容其实就是对资源合理利用,比如我们将一些大对象或者频繁 IO 操作内容保存(缓存)一个对象。...依据:Joshua Bloch "Effective Java, Second Edition", p. 283-284 DCLSingleton current = dclSingleton...枚举(推荐使用) public enum EnumIvoryTower { /** * 实例 */ INSTANCE; } 这种方法是一个叫做 Joshua Bloch...优点:资源合理分配和利用 缺点:违反了单一职责原则 简单说说 Joshua BlochEffective Java》、Effective 系列图书作者。

36220
您找到你想要的搜索结果了吗?
是的
没有找到

Java堆空间Vs栈内存

方法结束后,该块将立即立即变为未使用状态,用作下一个方法使用。 与堆内存分配,栈内存大小要小一点。 Java程序堆空间和栈内存分配 让我们用一个简单程序来了解堆和交替内存使用情况。...第1行找到main()方法后,Java Runtime创建堆内存将被main()线程中方法使用。 我们2行创建原始局部变量,因此将其创建并存储main()方法栈内存。...如果您对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写Effective Java 中文 第三版》 ,这是值得深读一本书。...堆内存由应用程序所有部分使用,而堆栈内存仅由一个执行线程使用。 在内存创建对象时,它始终存储堆空间中,并存储到包含该对象引用。内存仅包含本地原始变量和堆空间中对象引用变量。...堆存储对象可以分区访问,而其他线程则不能访问分区内存。 堆栈内存管理是以后进先出(LIFO)方式完成,而堆内存内存管理更复杂,因为它是全局使用

1.2K20

effective Java 创建和销毁对象篇

小伙伴们好呀,我是 小羊 ,今天来和大家分享下 《Effective Java》这本书2章 —— 创建和销毁对象 。一共有 9 点,一起看看叭~1....如果构造器有很多参数,建议用 builder 去创建对象这个就是 建设者模式 使用了,下面是作者 Joshua Bloch GitHub 仓库给例子package effectivejava.chapter2...用 枚举或者私有构造器 来强化 单例属性这个就差不多在说 单例模式 了可以看看之前文章: 一文带你看遍单例模式八个例子,面试再也不怕被问了 (我都忘光了)这两个也是作者 Joshua Bloch ...,可以看看 4ye 之前写四种引用类型Springboot使用 ,看看 Springboot 和线程池是如何巧妙用上 软引用和弱引用 。...Joshua Bloch GitHub 地址https://github.com/jbloch/effective-java-3e-source-code/tree/master/src/effectivejava

24620

计算机专业基础书籍推荐

编辑:小虾米 夏沫 本文根据网上参考资料以及自己学习经验总结整理而成,旨在给大家做一个参考,希望大家工作、学习遇到相关问题之后能从这些参考书中获得帮助。...Daniel Liang) 【译 者】戴开宇 【出版社】机械工业出版社 Effective Java中文版 【中文名】Effective Java中文版(第2版) 【英文名】Effective Java...(Second Edition) 【作 者】Joshua Bloch 【译 者】杨春花 / 俞黎敏 【出版社】机械工业出版社 Java程序员修炼之道 【中文名】Java程序员修炼之道 【英文名】..., and Corner Cases 【作 者】Joshua Bloch 【译 者】陈昊鹏 【出版社】人民邮电出版社 3 JVM 深入理解Java虚拟机 【作 者】周志明 【出版社】机械工业出版社...in Practice 【作 者】Brian Goetz / Tim Peierls / Joshua Bloch / Joseph Bowbeer / David Holmes / Doug Lea

1K100

JavaArray与ArrayList10个区别

Array和ArrayList都是Java两个重要数据结构,Java程序中经常使用。...由于数组本质上是静态,即一旦创建后就无法更改数组大小,因此,如果需要一个可以调整自身大小数组,则应使用ArrayList。这是Array和ArrayList之间根本区别。...好了,您可以查看《Effective Java内容,在其中可以声明一个像E []这样副本,然后使用类型转换。...如果您对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写Effective Java 中文 第三版》 ,这是值得深读一本书。...尽管ArrayList确实提供了size()方法,该方法告诉给定时间点存储ArrayList对象数量。size()始终与length不同,这也是ArrayList容量。

7.5K41

Java常量接口思考,项目中常量是放在接口里还是放在类里呢?

最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码反例, 蛋疼是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做。...这个应该很少人遇到过,不过这是 Effective Java 里面说。...Effective Java 作者 大佬原话 According to Joshua Bloch, author of "Effective Java": The constant interface...第三 基于数据只暴露给相应原则,一个类实现一个常量接口,可能只需要其中几个常量,而得到了更多无用常量, 所以,使用常量接口时候都是 import static const.valueAAA...总结 接口是定义类型,而不应该用于导出常量。常量接口不建议使用,应使用常量类。

2.1K11

推荐给初级Java程序员3本进阶书

Effective Java中文版》第二版 每个Java程序员书桌上都应该放有这本书。...让我们先了解下作者: Joshua Bloch是Google公司首席Java设计师,并且也是一位Jolt 奖获得者。...上面所有的问题(也包括其他74个)都有实用主义者Joshua Bloch详细解释。读完这本书,程序员应该能意识到使用Findbugs、Checkstyle这些工具必要性了。 ?...《Java并发编程实战》 一年前我正努力在做 UI 开发工作时(Eclipse 插件中使用SWT/JFace,其他一些项目则使用Swing ),就看了这本书。...UI开发和多核系统应用开发是学习如何开发线程安全软件系统一个很好理由。 这本书作者如下:Brian Goetz,Joshua Bloch(又出现这位大牛了,我们刚提到过,还记得吗?)

56510

Java之父们 : James Gosling , Alan Kay,Bill Joy,Joshua Bloch,Rickard Oberg,Doug Lea,Rod Johnson,Kent Be

Joshua Bloch : Java 2 元勋 文/莫映 早在1996年,适逢Java刚刚崭露头角,年内好事连连。...正是Java技术如火如荼、大展拳脚背景之下,Joshua Bloch来到了Sun,开始了他带领Java社区步入”迦南美地”漫长历程。 很快,他被从安全组调入核心平台组,从事底层API设计。...JoshuaJava贡献还不止于JDK,提起他大作《Effective Java》(Addison Wesley, 2001),相信Java粉丝们一定耳熟能详。...该书对Java社群影响,犹如C++社群Effective C++》。Joshua对JCP贡献也不小。...希望Joshua依然能继续”摩西未尽事业”,以他影响力推动Java社群继续前行。据称,《Effective Java下一版会加入Java 5.0部分,让我们翘首以待吧。

1.3K30

两个对象值相同(x.equals(y) == true),但却可有不同hash code,这句话对不对?

Java对于eqauls方法和hashCode方法是这样规定:(1)如果两个对象相同(equals方法返回true),那么它们hashCode值一定要相同;(2)如果两个对象hashCode相同,...当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同对象可以出现在Set集合,同时增加新元素效率会大大下降(对于使用哈希存储系统,如果哈希码频繁冲突将会造成存取性能急剧下降...补充:关于equals和hashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,Joshua Bloch大作《Effective Java》(很多软件公司,《Effective Java...实现高质量equals方法诀窍包括:1. 使用==操作符检查"参数是否为这个对象引用";2. 使用instanceof操作符检查"参数是否为正确类型";3....不要将equals方法参数Object对象替换为其他类型,重写时不要忘掉@Override注解。

99620

Java线程池那些事

熟悉java多线程朋友一定十分了解java线程池,jdk核心实现类为java.util.concurrent.ThreadPoolExecutor。...大家可能了解到它原理,甚至看过它源码;但是就像我一样,大家可能对它作用存在误解。现在问题来了,jdk为什么要提供java线程池?使用java线程池对于每次都创建一个新Thread有什么优势?...直到前段时间我看到一篇Neal Gafter(和Joshua Bloch合著了《Java Puzzlers》,现任职于微软,主要从事.NET语言方面的工作)访谈,里面有这么一段谈话(http://www.infoq.com...因为jvm会为每个线程分配一定内存(JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K,也可以通过jvm参数-Xss来设置),所以当线程数达到一定数量时就报了该error。...ThreadStackSize ThreadStackSize:线程栈大小,JDK5.0以后每个线程堆栈大小默认为1M,以前每个线程堆栈大小为256K;可以通过jvm参数-Xss来设置;注意-Xss是

70610

java程序员必读书单

Effective Java 尽管 Java 没有什么出色入门书籍,但这不代表 Java 没有出色必读书籍。...Effective Java 是我读过最好编程书籍之一,它包含大量优秀Java编程实践,并对泛型和并发这两个充满陷阱 Java 特性给出了充满洞察力建议,以至于 Java 之父 James Gosling...深入理解 Java 虚拟机(第2版) 非常优秀且难得国产佳作,系统介绍了 Java 虚拟机和相关工具,并给出了一些调优建议; Java 程序员修炼之道 在这本书之前,并没有一本 Java 书籍系统详细介绍...,以及如何编写正确并发程序; Java Puzzlers 包含了大量 Java 陷阱——以至于读这本书时我说最多一个词就是 WTF,这本书意义在于它是一个 反模式 大全, Effective...更有意思是,这两本书作者都是 Joshua Bloch 。 软件开发者路线图 是一本优秀且实用程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯特定阶段。

90940

Java 单例模式 五种常见写法

* 同时,对singleton对象使用volatile关键字进行限制,保证其对所有线程可见性,并且禁止对其进行指令重排序优化。 * 单例new情况非常少,绝大多数都是可以并行读操作。...因此加锁前多进行一次null检查就可以减少绝大多数加锁操作,执行效率提高目的也就达到了 * 注意:双重检查锁法,不能在jdk1.5之前使用, * 而在Android平台上使用就比较放心了,一般...Java - Joshua Bloch](https://www.amazon.cn/dp/B01DPUXUWG/ref=sr_1_2?...ie=UTF8&qid=1486966767&sr=8-2&keywords=Effective+Java)提倡方式, * 使用枚举,除了线程安全和防止反射强行调用构造器之外,还提供了自动序列化机制...* 因此,Effective Java 推荐尽可能地使用枚举来实现单例。 * 注意:枚举,虽然Effective Java推荐使用,但是Android平台上却是不被推荐

54610

Java 设计模式(三)《单例模式》

比如在某个服务器程序,该服务器配置信息存放在一个文件,这些配置数据由一个单例对象统一读取,然后服务进程其他对象再通过这个单例对象获取这些配置信息。这种方式简化了复杂环境下配置管理。...代码实践 Joshua Bloch, Effective Java 2nd Edition p.18 单元素枚举是使用单例模式最佳实践....---- 典型应用 项目中记录日志类 数据库连接 我们使用操作系统文件管理器 ---- 实际应用 java.lang.Runtime#getRuntime() java.awt.Desktop#getDesktop...() java.lang.System#getSecurityManager() ---- 结论 有类本身控制创建和销毁,违反了单一职责原则 鼓励使用全局共享实例,防止该对象使用对象和资源被解除分配。...---- 参考文献 Design Patterns: Elements of Reusable Object-Oriented Software Effective Java (2nd Edition)

33910

Java后端成长指南:架构、基础与进阶书单推荐

在这篇文章,我将为你推荐一些优秀书籍,帮助你Java后端领域迈向更高台阶。 基础知识篇 1....《Java编程思想》这本经典著作由Bruce Eckel所著,深入浅出地介绍了Java编程基本思想和核心概念。适合初学者和有一定经验开发者阅读,有助于构建扎实Java基础。 2....《Effective JavaJoshua Bloch这本书探讨了Java编程最佳实践,从代码风格到性能优化,都有详细讲解。它是提升编程技能和代码质量必读之作。 架构与设计篇 3....《Spring实战》这本书由Craig Walls编写,详细介绍了Spring框架各个模块和使用方法。SpringJava后端开发中广泛应用,掌握它能够帮助你更高效地构建应用。...Java后端领域,持续学习和提升是不可或缺一部分。通过阅读这些优秀书籍,你能够扎实自己基础,了解架构设计原则,优化性能,掌握进阶技能。

39740

10 道关于 Java 泛型面试题

1.Java泛型是什么 ? 使用泛型好处是什么? 这是各种Java泛型面试,一开场你就会被问到问题中一个,主要集中初级和中级面试。...那些拥有Java1.4或更早版本开发背景的人都知道,集合存储对象并在使用前进行类型转换是多么不方便。 泛型防止了那种情况发生。...它提供了编译期类型安全,确保你只能把正确类型对象放入集合,避免了在运行时出现ClassCastException。 2. Java泛型是如何工作 ? 什么是类型擦除 ?...关键仍然是使用泛型类型来代替原始类型,而且要使用JDK采用标准占位符。 7. 编写一段泛型程序来实现LRU缓存? 对于喜欢Java编程的人来说这相当于是一次练习。...这可能是Java泛型面试题中最简单一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua BlochEffective Java一书中建议使用List来代替Array,因为

67520
领券