不能通过 reflection attack 来调用私有构造方法 。
public enum Singleton {INSTANCE;public void whateverMethod() {}}
7. 登记式如果熟悉我们封装的工具包Toolbox,就会知道工具包内提供了一个登记式单例工具类Singleton 。
单例模式是一种非常常用的设计模式,但以上介绍的各种方法,都需要为每个单例类编写一些模板式的代码,为了简化,我们可以使用Singleton工具类 。
//获取单例对象//Student类必须要具备无参构造方法//每个类在一个进程中只能获得一个单例对象Student student = Singleton.get(Student.class);//移除单例对象Singleton.remove(Student.class);//清空所有单例对象Singleton.clear();//单例对象数量int size = Singleton.size();
其实他就是很像是spring容器 。
Singleton.java:
/** * 单例工具 * @author Unicorn */public final class Singleton {/*** 对象池*/private static Map<String, Object> pool = new ConcurrentHashMap();private Singleton() {}public static <T> T get(Class<T> clazz) {Assert.notNull(clazz);String key = clazz.getName();T obj = (T) pool.get(key);if (null == obj) {synchronized(Singleton.class) {obj = (T) pool.get(key);if (null == obj) {obj = ReflectUtil.newInstance(clazz);pool.put(key, obj);}}}return obj;}/*** 移除对象* @param clazz*/public static void remove(Class clazz) {if (null != clazz) {String key = clazz.getName();pool.remove(key);}}/*** 销毁,清空对象池*/public static void clear() {pool.clear();}public static int size() {return pool.size();}}
8. Spring容器spring容器核心机制是IoC和DI,其本身也提供了单例对象的支持 。
经验总结扩展阅读
- 微信支付v3接口的 官方 Java SDK
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
- 夯实Java基础,一篇文章全解析线程问题
- 微信上线安静模式 你期待微信上线哪些功能
- 小米mix fold pc模式_小米mix fold pc模式怎么打开
- 四 Java多线程-ThreadPool线程池-2
- 微信安静模式怎么设置
- 生成器函数 javascript异步编程之generator与asnyc/await语法糖
- Java Timer使用介绍
- 三 Java多线程-ThreadPool线程池