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

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

虽然DCL和静态都不错,但是它们并不能防止反序列化和反射生成多个实例。更好的写法当然是枚举了! ---- 3. 枚举 (推荐!!)...: 1.不用考虑懒加载和线程安全的问题,代码写法简洁优雅 2.线程安全   反编译任何一个枚举会发现,枚举里的各个枚举项是是通过static代码块来定义和初始化的(可以见后面3.2节反编译分析枚举有分析到这个...),它们会在被加载时完成初始化,而java的加载由JVM保证线程安全,所以,创建一个Enum类型的枚举是线程安全的 防止破坏   我们知道,序列化可以将一个的实例对象写到磁盘,然后再反序列化读回来...对于反射破坏的而言,枚举有同样的防御措施,反射在通过newInstance创建对象时,会检查这个是否是枚举,如果是,会抛出异常java.lang.IllegalArgumentException...(Singleton.INSTANCE); } } 运行结果如下: 3.2 反编译分析枚举   为了让大家进一步了解枚举,我们将上面枚举进行反编译javap -p Singleton.class

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

通过枚举实现模式

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

74320

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

Java 枚举Java 5 开始,提供了一种新的数据类型,枚举。和接口一样,枚举是一个特殊的,其实质上就是数量固定的多个常量对象的集合。枚举主要用来表示固定的事务类型。...看下图会有一个更直观的感受: 枚举特点: 枚举的直接父java.lang.Enum,但和java.lang.Object一样,枚举都不会显式地继承Enum。...Weekday day = Weekday.SATURDAY; 2.因为java.lang.Enum是所有枚举的父,所以所有的枚举对象可以调用Enum中的方法。...枚举模式 在>书中提到,建议使用枚举模式,能够很好的保护代码隐私,即使使用反射也不能创建对象。...通过以下的两种代码对比,能够很直观的展现枚举实现的模式: 完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程、科技知识。

54130

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

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

45820

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

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

75241

java枚举

一、 枚举的说明 枚举的理解:的对象只有有限个,确定的。 当需要定义一组常量时,强烈建议使用枚举 如果枚举只一个对象,则可以作为模式的实现方式。...二、如何定义枚举 ① 自定义枚举 class Season{ // 1.声明Season对象的属性:private final修饰 private final String seasonName...// 使用enum关键枚举 enum Season1{ // 1.提供当前枚举的对象,多个对象之间用“,”隔开,末尾对象";"结束 SPRING("春天","春暖花开"),...,枚举常用方法:(继承于 java.lang.Enum ) value() 返回所有的枚举对象的构成的数组 valueOf(String objName):返回枚举中对象名是 objName 的对象...interface Info{ void show(); } // 使用enum关键字枚举 enum Season2 implements Info{ //1.提供当前枚举的对象,

72440

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

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

35420

Java 枚举 详解

1、枚举是什么?   Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。...2、枚举和普通的区别   ①、使用 enum 定义的枚举默认继承 java.lang.Enum ,即枚举是不能再继承别的了。...而普通的一般父默认是 Object   ②、枚举的构造器只能使用 private 定义,而普通的还可以用 public 修饰   ③、枚举的所有实例必须在枚举中显示列出(,分隔   ;结尾)...首先我们看,以一个季节有春、夏、秋、冬四个对象为:在 JDK 1.5以前是怎么表示的呢?    ...switch--case 的表达式(JDK 1.5以后) ②、如果枚举的对象只有一个,那么可以作为模式的实现

1.2K90

初探Java枚举

); static {}; } 从反编译文件中可以得出以下结论: 定义的枚举值作为枚举的属性,会被默认修饰为 public static final ,从修饰关键字,即可看出枚举值本质上是静态常量...3.枚举特性 枚举的特性,归结起来就是一句话: 除了不能继承,基本上可以将 enum 看做一个常规的。...因为 enum 实际上都继承自 java.lang.Enum ,而 Java 不支持多重继承,所以 enum 不能再继承其他,当然也不能继承另一个 enum。但是枚举可以定义接口并实现。...Java 中提供了两个方便操作 enum 的工具——EnumSet 和 EnumMap。...,大大加强了程序的可读性、易用性和可维护性,并且在此基础之上又进行了扩展,使之可以像一样去使用,更是为Java对离散量的表示上升了一个台阶。

67910
领券