博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
阅读量:5838 次
发布时间:2019-06-18

本文共 937 字,大约阅读时间需要 3 分钟。

Singleton指只被实例化一次的类。一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类。

这个很经常使用。记得曾经实习面试的时候就有这个面试题。

一般採用的方法是将构造器私有化,然后提供一个static变量,再提供一个static的public方法用来返回static实例:

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

这个是单例工厂方法模式中的饿汉模式,另一种懒汉模式。

就是晚点实例化。就不写了

要提醒一点的是:享有特权的 client能够通过反射机制调用私有构造器。也就是平时说的暴力反射。详细能够參考我的还有一篇文章: 。假设须要抵御这样的攻击,能够改动构造器。让它在被要求创建第二个实例的时候抛出异常。

除了工厂方法另一种是公有域方法:
public class Elvis2 {public static final Elvis2 INSTANCE = new Elvis2();private Elvis2(){}public void leaveTheBuilding(){}}

这样的方法的长处就是清晰。明了。

缺点就是死板,性能不行。工厂方法长处就是灵活。

缺点就是能够非常easy被改动。比方改成为每一个调用该方法的线程返回一个唯一的实例。另外这两种方法使这个类变成是可序列化的比較麻烦。

。。。所以讲第三种方法:

public enum Elivis3 {INSTANCE;public void leaveTheBuilding(){}}
这种方法在功能上与公有域方法相近,可是它更加简洁。无偿地提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候。

尽管这样的方法还没有广泛採用。可是但元素的枚举类型已经成为实现Singletong的最佳方法!

转载地址:http://pxjcx.baihongyu.com/

你可能感兴趣的文章
Windows XP倒计时到底意味着什么?
查看>>
运维工程师在干什么学些什么?【致菜鸟】
查看>>
Linux中iptables详解
查看>>
java中回调函数以及关于包装类的Demo
查看>>
maven异常:missing artifact jdk.tools:jar:1.6
查看>>
终端安全求生指南(五)-——日志管理
查看>>
Nginx 使用 openssl 的自签名证书
查看>>
创业维艰、守成不易
查看>>
PHP环境安装套件:快速安装LAMP环境
查看>>
CSS3
查看>>
ul下的li浮动,如何是ul有li的高度
查看>>
C++ primer plus
查看>>
python mysqlDB
查看>>
UVALive 3942 Remember the Word Tire+DP
查看>>
从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~目录...
查看>>
被需求搞的一塌糊涂,怎么办?
查看>>
c_数据结构_队的实现
查看>>
jquery 选择器总结
查看>>
Qt设置背景图片
查看>>
【阿里云文档】常用文档整理
查看>>