枚举单例的实现

Java 枚举实现单例模式,线程安全又优雅! 枚举在序列化和反序列化时,并不会调用构造方法,这就防止了反序列化导致的单例破坏的问题。反编译任何一个枚举类会发现,枚举类里的各个枚举项是是通过static代码块来定义和初始化的(可以见后面3.2节反编译分析单例枚举有分析到这个),它们会在类被加载时完成初始化,而java类的加载由JVM保证线程安全,所以,创建一个Enum类型的枚举是线程安全的。因为存在着指令重排序的优化,第2、3步的顺序是不能保证的,最后的执行顺序可能是1-2-3,也可能是1-3-2,假如执行顺序是1-3-2,我们看看会出现什么问题。 阅读详情

枚举单例的实现

单例是什么我在这里不再详细说了,其他的饿汉模式单例、懒汉模式单例、双重加锁这么的在此都不讨论。我参考了网上其他人写的枚举单例,都差不多,没什么实用的参考价值,这里只给出我自己实现的枚举的单例写法,并且能够防止反射,希望大家一起讨论。

枚举单例

package com.example.demo.enums;

import com.example.demo.service.SingletonService;

/**
 * @classname: Singleton
 * @description: 单例示例
 * @author chenhx
 * @date 2020-03-18 10:05:17
 */
public enum SingletonOfEnum implements SingletonService {
    INSTANCE{
        @Override
        public String doSomething() {
            return "aaa";
        }

        @Override
        public void doPrint(String str) {
            System.out.println("this is a function doPrint:" + str);
        }
    };

    public static SingletonOfEnum getInstance(){
        return INSTANCE;
    }
}

其中枚举实现了接口SingletonService,这个接口里可以定义一些我们需要做的一些事,例如

SingletonService.java

/**
 * @classname: SingletonService
 * @description: 单例接口
 * @author chenhx
 * @date 2020-03-18 14:18:54
 */
public interface SingletonService {
    String doSomething();
    void doPrint(String str);
}

测试

    @Test
    public void test3() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        //通过枚举获取单例
        SingletonOfEnum instance = SingletonOfEnum.getInstance();
        String s = instance.doSomething();
        System.out.println(s);
        instance.doPrint(s);
        System.out.println(instance.hashCode());

        //通过枚举获取单例
        SingletonOfEnum instance2 = SingletonOfEnum.getInstance();
        System.out.println(instance2.hashCode());

        // 通过反射获取单例
        Constructor<SingletonOfEnum> constructor = SingletonOfEnum.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        SingletonOfEnum singleton3 = constructor.newInstance();
        System.out.println(singleton3);
    }

通过观察控制台,我们发现,通过枚举获取的单例对象确实是同一个,但是通过反射获取实例,就会出现异常,因为枚举是不能通过反射去调用他的私有构造方法的。
在这里插入图片描述

JAVA 枚举单例模式及源码分析的实例详解 主要介绍了 JAVA 枚举单例模式及源码分析的实例详解的相关资料,需要的朋友可以参考下 立即下载

相关推荐

YOLOv11 改进策略 | HWD:引入 Haar 小波变换,减少信息丢失

在卷积神经网络(CNN)中,下采样(Downsampling)是降低特征图分辨率、扩大感受野的关键操作,通常通过最大池化(MaxPool)或步长为 2 的卷积(Strided Convolution)实现。然而,这些方法在降低分辨率的同时,往往会丢失图像中的高频细节信息(如边缘、纹理)和精确的空间位置信息,这可能对后续特征提取和目标检测精度产生不利影响,尤其是对于小目标和需要精细定位的任务。

走向CTO的路上... 1789

单例模式之枚举实现

如果你没有学过单例模式,请点击:确保对象的唯一性——单例模式。 有很多网友留言说我漏掉了一种非常重要的Java语言的单例模式实现方式——枚举。 这篇姗姗来迟的博文将弥补这个“巨大的”缺陷。 在Java语言中,如果综合考虑线程安全和延迟加载,IoDH(Initialization Demand Holder)无疑是一种比较好的实现方式【参见:确保对象的唯一性——单例模式 (四)】,它巧妙利用了Java静态内部类的特点。 但...

刘伟技术博客 3万+

无线网卡选购指南:哪些型号支持Kali Linux的监听模式?附免驱动网卡推荐

本文详细解析了如何在Kali Linux下选购支持监听模式的无线网卡。核心在于选择兼容的芯片组,如Atheros AR9271和Ralink RT3070等经典型号,并提供了免驱动网卡推荐与实战配置指南,帮助安全研究人员和爱好者快速搭建无线测试环境。

wind6的博客 1555

用枚举enum实现单例

用枚举enum实现单例

PacosonSWJTU的博客 1772

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

相位编码脉冲压缩信号的理论研究与 Matlab 实现

通过实际的代码示例,我们展示了如何生成信号、进行相位编码、传输信号、相位解码和脉冲压缩的步骤。相位编码脉冲压缩信号是通过在发射端对信号进行相位编码,并在接收端对信号进行相位解码来实现的。其主要原理是在发射端将信号的频率进行调制,使得信号具有宽带特性,然后在接收端通过匹配滤波器对信号进行解调和压缩,从而提高信号的分辨率和抗干扰能力。相位编码脉冲压缩信号是一种在信号处理中常用的技术,用于提高信号的分辨率和抗干扰能力。可以使用 Matlab 中的信号生成函数生成一个宽带脉冲信号,例如矩形脉冲信号或高斯脉冲信号。

CyberWizarDD的博客 901

枚举进阶,获取枚举实列

枚举进阶用法

weixin_61294560的博客 296

基于simulink的能量管理策略的场景实例:混合动力电动汽车(HEV)的能量回收与分配策略

本文以混合动力电动汽车(HEV)为研究对象,通过Simulink建模详细演示了能量管理策略的设计与实现。内容涵盖HEV系统架构、核心组件工作原理,并分步骤指导搭建车辆动力学模型、动力系统组件模型和基于规则的能量管理策略。重点分析了制动能量回收与功率分配机制,通过仿真验证了逻辑门限策略在提升燃油经济性和维持电池SOC平衡方面的有效性。文章最后展望了更高级控制策略的应用前景,为HEV能量优化提供了完整的仿真研究框架。

xiaoheshang_123的博客 213

枚举实现单例

转载自 为什么我墙裂建议大家使用枚举来实现单例 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient way to implement a singleton pattern in Java?的讨论: 如上图,得票率最高的回答是:使用枚举。 回答者引用了Joshua Bloch大神在《Effective Java》中明确表达...

simple的博客 5195

dify upload存在SSRF漏洞

Dify 是一个用于构建 AI 应用程序的开源平台。

nnn2188185的博客 1479

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2807

面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?

实在是没想到,他会这么问我

敖丙 2万+

【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

论文全称:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments 论文原文:https://download.youkuaiyun.com/download/sinat_39620217/16203960 论文翻译:https://blog.youkuaiyun.com/qiusuoxiaozi/article/details/79066612 ...

丨汀、的博客 2万+

【单例深思】枚举实现单例原理

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为是实现Singleton的最佳方法。 其实现非常简单,如下: public enum Singleton {     INSTANCE;     private Singl

InkGenius 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使用枚举实现单例

用枚举实现单例,除了线程同步之外貌似没有其他什么作用吧?是我的写法不对吗? package thread; import java.io.ObjectStreamException; import java.io.Serializable; /** * 线程安全、防反射、防反序列化的单例模式 * * @author LYW * @date 2019/3/21 * @since J...

qq_38811611的博客 229

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【线程安全的单例实现方式二:枚举单例】

问题答案概要关键原理1️⃣ 限制实例个数由枚举常量个数决定,JVM 自动创建JVM & Enum 机制2️⃣ 是否线程安全是,类初始化阶段由 JVM 同步保证class init 锁3️⃣ 是否能被反射破坏否,JVM 禁止反射创建 enum 实例4️⃣ 是否能被反序列化破坏否,反序列化根据名字返回现有实例5️⃣ 属于哪种单例介于懒汉与饿汉之间:类加载时创建延迟加载的饿汉式6️⃣ 如何初始化逻辑在枚举构造器中执行即可构造器线程安全执行一次。

2501_93101910的博客 1011

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

枚举实现单例那些事儿

《Effective Java》一书中提到,单元素的枚举类型,功能完整、使用简洁、无偿提供了序列化机制,在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,被作者认为是实现单例模式的最佳方法(也是一种饿汉式)。实现非常简单:public enum Singleton { INSTANCE; public void getOtherMethod() { ...

qq_34964197的博客 1954

用枚举法实现单例设计模型

用枚举法实现单例设计模型        接着上一篇博客写到的几种设计形式下的单例设计模型,上一篇写到的分别由懒汉式(线程不安全),懒汉式(线程安全),饿汉式,双检锁/双重校验锁,登记式/静态内部类,其中的枚举法是放在这里写。 接下主要先破解各个设计形式的单例设计模型。 采用Java反射机制破解单例设计模型        下面以懒汉式为例子 public class De

做技术,坚持才是最重要的,一时的热情只是暂时的进步 594

Effective Java --通过枚举enum实现单例设计

Effective Java --通过枚举enum实现单例设计 最近在看Effective Java,记录下之后编码时可以注意的一些习惯,提高编码质量 每提高一点都是积累 通过枚举enum实现单例设计 实现枚举类 枚举中的属性必须放在最前面,一般使用大写字母表示 枚举中可以和java类一样定义方法 枚举中的构造方法必须是私有的 通过枚举来实现单例 实现单例的核心在于privat...

jtf8525140的专栏 475

为什么说枚举是最好的Java单例实现方法?

很久没有写过接地气的东西了,今天随便写一个非常基础的。其实这篇文章也可以叫做《Java单例的破坏与防御方法》,无所谓了。 讲解Java单例实现方式及其原理的文章数不胜数,本文就不再多废话。在实际生产环境中,以下3种方式最常用,先复习一下。看官也可以试试能不能不参考任何资料,将下面的问题都回答正确。 Java单例的三种经典实现 双重检查锁(DCL) public class Doub...

LittleMagic's Blog 522

为什么我强烈建议大家使用枚举来实现单例

在所有的单例实现方式中,枚举是一种在代码写法上最简单的方式,之所以代码十分简洁,是因为Java给我们提供了enum关键字,我们便可以很方便的声明一个枚举类型,而不需要关心其初始化过程中的线程安全问题,因为枚举类在被虚拟机加载的时候会保证线程安全的被初始化。除此之外,在序列化方面,Java中有明确规定,枚举的序列化和反序列化是有特殊定制的。这就可以避免反序列化过程中由于反射而导致的单例被破坏问题。

m0_64363449的博客 173

为什么强烈建议大家使用枚举来实现单例

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33726313的博客 109

Java 中枚举类型实现单例

从Java1.5开始,可以使用枚举类型实现单例。 public class EnumSingleton { public static EnumSingleton getInstance() { return Elvis.INSTANCE.getInstance(); } private enum Elvis { INSTANCE; ...

一品大帅的专栏 3793
上一篇: Java8 Optional的使用
Agger_chen
博客等级 码龄10年 49粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值