回字有四种写法,那你知道单例有五种写法吗 (3)

哎嘿,不是说所有单例都是那三元素吗,这里怎么只有两个元素呀!这是因为枚举就没有构造方法,自然而然就做到了私有化构造函数的效果,而且比私有化构造函数效果更好!因为都没有构造函数了,连序列化和反射都破坏不了这种写法的单例!!

眼见为实,我们做个试验:

public static void main(String[] args) throws Exception { // 创建100个线程同时访问实例 for (int i = 0; i < 100; i++) { new Thread(() -> { System.out.println(Singleton05.getINSTANCE().hashCode()); }).start(); } // 反射破坏单例 Class<Singleton05> clazz = Singleton05.class; // 拿到无参构造函数并将其设置为可访问,无视private Constructor<Singleton05> constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); // 创建对象 Singleton05 singleton05 = constructor.newInstance(); System.out.println("反射:" + singleton05.hashCode()); }

运行结果如下:

... 422057313 422057313 422057313 422057313 Exception in thread "main" java.lang.NoSuchMethodException: Singleton05.<init>() at java.lang.Class.getConstructor0(Class.java:3082) at java.lang.Class.getDeclaredConstructor(Class.java:2178)

当运行到反射那一块代码的时候,程序直接报错,原因就是我之前所说的一样,枚举没有构造方法,你自然就无法通过反射来创建对象了!

优缺点

此方法乃是最完美的方法,真是佩服想出这种写法的前辈!

总结

五个写法全部介绍完毕,每个写法都有其特点,根据自己的需求来写就好了!每种写法理解其特点后,写出来也就非常轻松。就像我一开始说的一样,理解这五种写法也不是吊书袋,每一种写法都有其背后的思考,有些写法思路真的让人叹服,至少我了解到内部类和枚举写法的时候我心里就是:我靠!这都能想出来,太牛逼了吧......

好的代码就是艺术作品,希望我们都能码出好的艺术出来!

回字有四种写法,那你知道单例有五种写法吗

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfsjd.html