首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java枚举模式比DCL和静态要好?———反编译分析枚举

虽然DCL和静态都不错,但是它们并不能防止反序列化和反射生成多个实例。更好的写法当然是枚举了! ---- 3. 枚举 (推荐!!)...),它们会在类被加载时完成初始化,而java类的加载由JVM保证线程安全,所以,创建一个Enum类型的枚举是线程安全的 防止破坏   我们知道,序列化可以将一个的实例对象写到磁盘,然后再反序列化读回来...综上,枚举可以防止反序列化和反射破坏。...3.1 枚举模式的使用 // Singleton.java public enum Singleton { INSTANCE; public void testMethod() {...(Singleton.INSTANCE); } } 运行结果如下: 3.2 反编译分析枚举类   为了让大家进一步了解枚举类,我们将上面枚举类进行反编译javap -p Singleton.class

55610
您找到你想要的搜索结果了吗?
是的
没有找到

通过枚举实现模式

枚举(Enum Singleton)是实现模式的一种新方式,尽管模式java中已经存在很长时间了,但是枚举相对来说是一种比较新的概念,枚举这个特性是在Java5才出现的,这篇文章主要讲解关于为什么我们应该使用枚举来实现模式...,它与传统方式实现的模式相比较又有哪些优势?...枚举写反简单 写法简单这是它最大的优点,如果你先前写过模式,你应该知道即使有DCL(double checked locking) 也可能会创建不止一个实例,尽管在Java5这个问题修复了(jdk1.5...静态工厂实现法: 这是我最喜欢的一种方式来实现模式,因为是静态的final变量,当类第一次加载到内存中的时候就初始化了,所以创建的实例固然是thread-safe。...枚举自己处理序列化 传统存在的另外一个问题是一旦你实现了序列化接口,那么它们不再保持了,因为readObject()方法一直返回一个新的对象就像java的构造方法一样,你可以通过使用readResolve

71720

【地铁上的设计模式】--创建型模式模式(五)--枚举

什么是枚举 枚举是指使用枚举类型来实现模式,它是模式中最简单、最安全的一种实现方式。...如何实现枚举 实现枚举的步骤如下: 定义一个枚举类型,枚举值就是实例; 在枚举类型中定义实例的属性和方法。 在程序中使用实例时,直接引用枚举类型中的枚举值即可。实现代码如下。...Java实现 以下是在Java中实现枚举的示例代码: public enum Singleton { INSTANCE; private Singleton() {...注意,C#不支持在枚举类型中定义构造函数,因此需要将实例的属性和方法定义在另一个类中,并在程序中通过该类来操作实例。 总结 枚举是一种非常简单、安全且可靠的实现方式。...在Java和C#中,枚举类型是天然的类型,可以通过定义枚举常量来实现枚举不仅避免了线程安全问题,还可以防止反序列化和反射攻击,因此是一种非常优秀的实现方式。

33520

JAVA」以周的案例引出Java 枚举,以设计模式实践Java 枚举

Java 枚举Java 5 开始,提供了一种新的数据类型,枚举。和接口一样,枚举是一个特殊的类,其实质上就是数量固定的多个常量对象的集合。枚举主要用来表示固定的事务类型。...看下图会有一个更直观的感受: 枚举特点: 枚举的直接父类是java.lang.Enum,但和java.lang.Object一样,枚举都不会显式地继承Enum。..."); // 把一个指定名称字符串转换为当前枚举类中同名的常量. 4.从Java 5开始switch也支持操作枚举类型。...枚举模式 在>书中提到,建议使用枚举类做模式,能够很好的保护代码隐私,即使使用反射也不能创建对象。...通过以下的两种代码对比,能够很直观的展现枚举实现的模式: 完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程、科技知识。

52730

java模式

Java中,模式是一种非常重要的设计模式,因为Java是一种面向对象的语言,它的许多库和框架都使用了模式。在本文中,我们将详细介绍Java模式的实现方式、使用场景、优点和缺点。...Java中,枚举也是一种实现模式的方式,因为枚举类型的实例是唯一的。...使用枚举实现模式不仅线程安全,而且还可以防止反射攻击和序列化攻击。...可以通过枚举实现模式来解决这个问题。不适用于大型系统在大型系统中,模式可能会成为系统的瓶颈,因为在整个系统中只存在一个对象实例,可能会导致竞争和冲突。...五、模式的扩展多例模式多例模式模式的扩展,它可以存在多个实例,但每个实例都有一个唯一的标识符。例如Java中的枚举类型就是一种多例模式

52851

Java枚举:为什么它是模式的最佳选择?

所以今天介绍一下,为什么枚举是实现模式的最佳选择。...序列化安全   使用枚举实现模式可以避免序列化和反序列化的问题。在 Java 中,当一个类被序列化并在另一个 JVM 中反序列化时,它会创建一个新的对象。...防止反射攻击   使用枚举实现模式可以防止反射攻击。在 Java 中,反射机制可以通过 Class 类来获取对象的构造函数并创建新的对象。...如果使用枚举实现模式,则可以避免这种攻击,因为枚举类型的构造函数是私有的,不能通过反射来调用。 简单明了可读性强   使用枚举实现模式可以使代码更加简洁明了。...此外,枚举类型的构造函数是私有的,也可以防止反射攻击。所以说java枚举是实现模式的最佳选择。

34620

JAVA模式

1)模式的定义: 在整个应用中,保证一个类只有一个实例,它提供了一个可以访问到它自己的全局访问点(静态方法)。 模式有以下特点: 1、类只能有一个实例。...2、类必须自己创建自己的唯一实例。 3、类必须给所有其他对象提供这一实例。 模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。...总之,选择模式就是为了避免不一致状态。 模式中有区分了懒汉式和饿汉式,懒汉式主要是用时间来换空间,饿汉式则是用空间来换时间。...,如果你第一次接触模式,对线程安全不是很了解,可以先跳过下面这三小条,去看饿汉式,等看完后面再回头考虑线程安全的问 1、在getInstance方法上加同步 public static synchronized...这里我对登记式标记了可忽略,我的理解来说,首先它用的比较少,另外其实内部实现还是用的饿汉式,因为其中的static方法块,它的在类被装载的时候就被实例化了。

62320

Java模式

今天正好看到InfoQ上边介绍的一则,就自己动手学习了一番,分享到博客。   首先,什么式模式呢? 模式,也叫单子模式,是一种常用的软件设计模式。...在应用这个模式时,对象的类必须保证只有一个实例存在(摘自维基百科),  然后分为饿汉式加载和懒汉式加载, 懒汉式:指全局的实例在第一次被使用时构建。...饿汉式:指全局的实例在类装载时构建。...双重检查锁定模式首先验证锁定条件(第一次检查),只有通过锁定条件验证才真正的进行加锁逻辑并再次验证条件(第二次检查)。 它通常用于减少加锁开销,尤其是为多线程环境中的模式实现“惰性初始化”。...看完了上面的两个概念,我们再来看上面的模式 instance= new Single1() 此语句并非原子操作,所以会被拆分, 1 给instance 分配 内存 2 调用Single1的构造函数初始化变量

82230

java模式

设计模式:解决一个类在内存中只存在一个对象  多用于环境变量设置等  模式的要求:1.只能有一个对象,禁止其他程序建立该类对象          2.要提供外界对对象的访问方式  解决办法:1...注:因为访问方式是静态的,所以对象也要是静态的       3.提供一个public static 的访问方式,以为要通过类名来访问,而不是通过对象来访问  提示:这里的单利模式是很简单的一个举例,需要其他的功能可以添加...7 public static singleModel1 getInstance(){ 8 return s; 9 } 10 } 11 /* 12 * 还有一种模式如下...if(s==null){ 22 s=new singleModel2(); 23 } 24 return s; 25 } 26 } 其实模式本质上还是

53310

Java 模式

模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。...这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 一:注意: 1、类只能有一个实例。...2、类必须自己创建自己的唯一实例。 3、类必须给所有其他对象提供这一实例。...三:模式分为饿汉式加载与懒汉式加载 1.饿汉式加载:很饿,只要类加载了就进行对象初始化,万一不用?...虽说懒汉式加载为我们解决了 什么时候需要什么时候加载问题,但是前情提要,一个好的模式还需要考虑线程安全问题 而考虑线程安全,我们就会想到多个线程抢锁问题,所以这里采用双检锁思想。

39010

Java 模式

模式 3.1 定义 模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 3.2 问题场景 在 2.6.2 中,我们读取了配置文件中的内容。...然后由这个类来提供外部可以访问这个类实例的方法,这就是模式的实现方式。 在 Java 中,模式的实现又分为两种,一种称为懒汉式,一种称为饿汉式。...下面分别来看看这两种实现方式的代码示例: 3.3.1 懒汉式 LazySingleton.java: package singleton; /** * 懒汉式模式 */ public class...3.6 最佳实践:枚举 使用枚举来实现实例控制会更加简洁,而且无偿地提供了序列化的机制,并由 JVM 从根本上提供保障,绝对防止包括反射方式在内的多次实例化,是更简洁、高效、安全的实现的方式。...:更简洁、高效、安全 通过枚举实现:是最佳实践 通过枚举实现:是最佳实践

54500

Java模式

1 什么是模式Java(Singleton)模式是一种广泛使用的设计模式模式的主要作用是保证在Java程序中,某个类只有一个实例存在,一些管理器和控制器常被设计成单模式。...如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用,那么模式也许是一个值得考虑的选择。 模式有以下特点: 类只能有一个实例。 类必须自己创建自己的唯一实例。...如果是一个非常重的对象,模式可以懒加载,静态类就无法做到。 那么什么时候应该用静态类,什么时候应该用模式呢?...还可以这样说,当你需要面向对象的能力(比如继承、多态)时,选用类,当你仅仅是提供一些方法时选用静态类。 3 如何实现模式模式有很多种写法,大部分写法都或多或少有一些不足。...而枚举类很好的解决了这两个问题,使用枚举除了线程安全和防止反射调用构造器之外,还提供了自动序列化机制,防止反序列化的时候创建新的对象。因此,《Effective Java》作者推荐使用的方法。

5710

JAVA中的模式分析(doublecheck和枚举实现)

文章目录 1.饿汉模式 2.懒汉模式 3.更好的解决办法 在java中,模式的实现方法有如下几种: 1.饿汉模式 所为饿汉模式,即一开始就创建一个静态的对象,之后该对象一直存在。...if (instance == null) { instance = new SingletonDemo4(); } } return instance; } } 这样模式才完全解决...上述方法比较冗繁,有没有更好的解决办法呢,有幸阅读过《effective java》这本书对于有更好的解决办法。...这种方法很巧妙地利用一个内部类,很简单的代码即实现了,而且是线程安全。 方式二:《effective java》中还有一种更简单的写法,那就是枚举。...中,枚举天然实现了模式

73141

Java模式

模式应该是我们接触的众多设计模式中的第一个,但是对于模式的一些细节地方对于初学者来说并不是很清楚,所以本文就来整理下单模式。...模式   模式的核心是保证一个类只有一个实例,并且提供一个访问实例的全局访问点。...枚举 /** * 模式枚举方式实现 * @author dengp * */ public enum SingletonInstance5 { // 定义一个枚举元素,则这个元素就代表了...; import java.io.Serializable; /** * 模式:懒汉式 * @author 波波烤鸭 * */ public class SingletonInstance2...总结 这几种设计模式如何选择 1、对象占用资源少,不需要延时加载: 枚举式 好于 饿汉式 2、对象占用资源大,需要延时加载: 静态内部类式 好于 懒汉式

1K20
领券