码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(一)单例模式:3-静态内部类模式

时间:2017-09-10 18:50:11      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:img   null   lap   静态内部类   private   gif   入侵   有一个   close   

思想:

 

  相比于懒汉以及饿汉模式,静态内部类模式没有一个较为官方的名称,这只是我个人的称谓。但是却是许多人更为推荐的一种形式。

  顾名思义,这种模式使用了一个私有的静态内部类,来存储外部类的单例,这种静态内部类,一般称为 Holder。

  而利用静态内部类的特性,外部类的 getinstance() 方法,可以直接指向 Holder 持有的对象。

 

技术分享
 1 public class StaticInnerSingleton {
 2 
 3     private StaticInnerSingleton() {
 4         if (SingletonHolder.instance != null) {
 5             throw new IllegalStateException();
 6         }
 7     }
 8 
 9     private static class SingletonHolder {
10         private static StaticInnerSingleton instance = new StaticInnerSingleton();
11     }
12 
13     public static StaticInnerSingleton getInstance() {
14         return SingletonHolder.instance;
15     }
16 
17 }
静态内部类模式

 

考虑反射:

 

  由于在调用 SingletonHolder.instance 的时候,才会对单例进行初始化,而且通过反射,是不能从外部类获取内部类的属性的。

  所以这种形式,很好的避免了反射入侵。

 

考虑多线程:

 

  由于静态内部类的特性,只有在其被第一次引用的时候才会被加载,所以可以保证其线程安全性。

 

总结:

  优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。

  劣势:需要两个类去做到这一点,虽然不会创建静态内部类的对象,但是其 Class 对象还是会被创建,而且是属于永久带的对象。

  

设计模式(一)单例模式:3-静态内部类模式

标签:img   null   lap   静态内部类   private   gif   入侵   有一个   close   

原文地址:http://www.cnblogs.com/jing-an-feng-shao/p/7501576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!