今天不思考人生,说说 Android 中的单例。
单例模式大概已经被网上写烂了吧?那也拦不住我在写一遍哈哈哈。但今天谈的不是单例怎么写,毕竟如何写单例网上一抓一大把,只是看看 Android 中的单例运用。
先说说单例模式运用场景,为了避免产生多个对象消耗过多的资源,或者某个对象的类型它确实只应该存在一个,那我们就会考虑使用单例模式。
单例模式可用以下方式实现:
饿汉模式
懒汉模式
双重检查
静态内部类
枚举
我在看书中的时候书中说到四个实现单例的关键点:
1.构造函数不对外开放, 一般为 Private;
2.通过一个静态方法或者枚举返回单例类对象;
3.确保单例类的对象有茄子有一个,尤其是在多线程中;
4.确保单例对象在反序列化时不会从构建对象。
1,2毋庸置疑,3,4是需要注意的点,在多线程中我们需要去关心我拿到的单例对象是否依然还是同一个,不过我对于反射这个也有一点的困惑,因为通过反射哪怕是私有修饰符我也可以拿到,从而使我通过私有的构造器去创建另一个该对象的实例(大概是大家不会这么做,而我只是好奇,不过反射你这是作弊啊!!!),对于第四点我不是很懂,我还在继续在网上看资料。。。
// 测试反射创建单例和单例本身
Class singletonClass = Singleton.class;
Constructor[] c = singletonClass.getDeclaredConstructors();
// 可以访问私有
c[0].setAccessible(true);
Singleton singleton = Singleton.getSingleton();
LoggerUtil.printGeneralLog(singleton);
try {
Singleton s = (Singleton) c[0].newInstance();
s.test();
LoggerUtil.printGeneralLog(s);
}...省略catch