目前单例模式有三种形式
1、提供一个静态的公共属性
2、提供一个静态的公共方法
3、enum类型的(这个是针对jdk 1.5以及1.5版本以上的)
enum SingletonExample {
INSTANCE;
public static SingletonExample getInstance() {
return INSTANCE;
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class EnumTest {
public static void singletonTest() throws IllegalArgumentException, InstantiationException,
IllegalAccessException, InvocationTargetException {
try {
//得到第一个实例
SingletonExample s = SingletonExample.getInstance();
//用反射得到第二个实例,这里引用类的时候得写全路径,否则会报找不到类
Class c = Class.forName("com.wush.singleton.SingletonExample");
//getDeclaredConstructors返回 Constructor 对象的一个数组,
//这些对象反映此 Class 对象表示的类声明的所有构造方法。
//它们是公共、保护、默认(包)访问和私有构造方法。
//返回数组中的元素没有排序,也没有任何特定的顺序。
//如果该类存在一个默认构造方法,则它包含在返回的数组中。
//如果此 Class 对象表示一个接口、一个基本类型、一个数组类或 void,
//则此方法返回一个长度为 0 的数组
Constructor[] con = c.getDeclaredConstructors();
Constructor conc = con[0];
//setAccessible将此对象的 accessible 标志设置为指示的布尔值。
//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
//值为 false 则指示反射的对象应该实施 Java 语言访问检查。
conc.setAccessible(true);
SingletonExample ss = (SingletonExample)conc.newInstance();
System.out.println(s+"/"+ss);
System.out.println(s==ss);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IllegalArgumentException,
InstantiationException, IllegalAccessException, InvocationTargetException {
singletonTest();
}
}
结果如下
Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:492)
at com.test.EnumTest.singletonTest(EnumTest.java:26)
at com.test.EnumTest.main(EnumTest.java:34)
从结果可以看出用enum的单例是最安全的,其它两种方式都可以用反射得到
分享到:
相关推荐
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
通常单例模式在Java语言中,有两种构建方式: 懒汉式—线程不安全:最基础的实现方式,线程上下文单例,不需要共享给所有线程,也不需要加synchronize之类的锁,以提高性能。...java中枚举类本身也是一种单例模式
一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举) 文章目录一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)什么是单例?单例有哪些运用场景?实现1.饿汉式测试优化-final2.懒汉式优化-加锁同步3.DCL双检锁/双重...
单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例。 #### 单例设计模式实现步骤 1. 将构造方法私有化,使其不能在类的外部通过new...
目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
SharpPcap 是一个.NET 环境下的网络包捕获框架,基于著名的 pcap/WinPcap 库开发。提供了捕获、注入、分析和构建的功能,适用于 C# 和 VB.NET 开发语言。...4. 通过使用单例模式来提升 PcapDeviceList 的性能
32 单例模式 47 32.1 饿汉模式 47 32.2 懒汉模式 47 33 接口(interface) 48 33.1 如何创建一个接口。 48 33.2 如何使用接口 48 33.3 如何使用类实现一个接口 49 33.4 接口的细节 49 34 接口的应用(面向对象分析)...
单例模式 & 多例模式 代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 IOC容器设计原理及高级特性 AOP设计原理 FactoryBean和BeanFactory Spring事务处理机制 Spring JDBC Spring MVC九大组件 手动实现...
通过单例模式获取到对象后。就是只有一个对象的类 方法全部都是非static修饰的,调用方式:对象名.方法名(...); 4. 工具类命名: XxxUtil、XxxUtils、XxxTool、XxxTools 3. jar 包 (掌握)...
单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201...
枚举单例(线程安全,调用效率高,不能延时加载) : 简单工厂模式:用来生产同一等级结构中的任意产品(对已有产品新增功能,需要修改源代码)虽然能通过工厂来创建对象,但是违反了开闭原则。一旦增加功能需要在...
day02-抽象类、接口、代码块,final、单例、枚举 day03-多态、包、权限修饰符、内部类,Object类,Date类 day04-常用API、正则表达式,泛型、Collection集合API day05-迭代器,数据结构,List,Set ,TreeSet集合,...
枚举: name 单例: writeReplace(), readResolve() 安全性: 网络传输 通用性: 跨平台、跨语言 可扩展性: 是否支持自动加入新的字段 性能: 空间开销(序列化大小)、时间开销(序列化/反序列化时间) 序列化协议: stream、...
Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 2. Java基础语法、类型转换、运算符、Scanner 3. 分支结构、循环结构...14. XML、解析、工厂模式和装饰模式
java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 ...枚举类型提供了这种保证 (PRO) 静态方法可以返回其返回类型的任何子类型的对象,与构造函数不同 这会导致 API 紧凑 适合基于接口的框架(条目
14.4 类型模式 224 14.5 匹配数组、列表和元组 225 14.6 提取器 227 14.7 变量声明中的模式 227 14.8 for表达式中的模式 229 14.9 样例类 229 14.10 copy方法和带名参数 230 14.11 case语句中的中置表示法 ...
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...
实例31 单例模式(Singleton) 75 实例33 开车(简单工厂模式) 77 实例33 旅游(工厂方法模式) 79 实例34 花园布局(抽象工厂模式) 80 实例35 几何图形(适配器模式) 82 第6章 字符串 85 实例36 获取字符...
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...