广告
返回顶部
首页 > 资讯 > 精选 >如何使用枚举来实现java单例模式
  • 476
分享到

如何使用枚举来实现java单例模式

2023-06-20 16:06:43 476人浏览 独家记忆
摘要

这篇文章主要介绍“如何使用枚举来实现java单例模式”,在日常操作中,相信很多人在如何使用枚举来实现java单例模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用枚举来实现java单例模式”的疑惑有所

这篇文章主要介绍“如何使用枚举来实现java单例模式”,在日常操作中,相信很多人在如何使用枚举来实现java单例模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用枚举来实现java单例模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 传统的单例写法解决了什么问题

    • 仍然存在的问题

    • 为什么枚举就没有问题

传统的单例写法解决了什么问题

首先,在大多数情况下(不包含面试),传统的单例写法已经完全够用了。通过 synchronized 关键字解决了多线程并发使用。

public synchronized static SingleClassV1 getInstance(){        if(instance == null){            instance = new SingleClassV1();        }        return instance;    }

考虑到每次获取单例对象都需要加,解锁。又有人发明了双重锁校验 + volatile 关键字模式:

private static volatile SingleClassV2 instance;    public static SingletonV2 getInstance() {         if(instance == null){             synchronized (SingletonV2.class){                 if(instance == null){                     instance = new SingletonV2();                 }             }         }         return instance;     }

另外一种为了解决单例被重复初始化的写法:利用类只会被初始化一次的特性,又有人发明出来一种内部类单例的写法。

 private static class SingletonHolder {         private static final SingletonV3 INSTANCE = new SingletonV3();     }     public static final SingletonV3 getInstance() {         return SingletonHolder.INSTANCE;     }

仍然存在的问题

由于 java 中有反射 api 这种变态的存在,以上所有的私有构造方法在反射面前都是毛毛雨。

Class<?> clazzV2 = Class.forName(SingleClassV2.class.getName());    Constructor<?> constructor = clazzV2.getDeclaredConstructors()[0];    constructor.setAccessible(true);    Object o = constructor.newInstance();

看来私有方法是防君子不防小人

为什么枚举就没有问题

我们来先看一下基于枚举的单例是什么样的。

public enum SingleClassV4 {    INSTANCE;    public String doSomeThing(){        return "hello world";    }}

当然,从 java 代码是看不出来任何端倪的。再使用 javap 看一下字节码。

public final class git.frank.SingleClassV4 extends java.lang.Enum<git.frank.SingleClassV4>  minor version: 0  major version: 52  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_ENUM

可以发现,枚举类型会帮我们自动继承 java.lang.Enum 类。并且,在 flags 中该类被添加了 ACC_ENUM 标识。然后,再看一下枚举类的构造方法:

  private git.frank.SingleClassV4();    descriptor: (Ljava/lang/String;I)V    flags: ACC_PRIVATE    Code:      stack=3, locals=3, args_size=3         0: aload_0         1: aload_1         2: iload_2         3: invokespecial #6                           // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V         6: return      LineNumberTable:        line 3: 0//加入Java开发交流君样:756584822一起吹水聊天      LocalVariableTable:        Start  Length  Slot  Name   Signature            0       7     0  this   Lgit/frank/SingleClassV4;    Signature: #29                          // ()V

枚举类也是要有构造方法的,而且也和普通的类没什么不同,也一样可以通过反射获取到:

如何使用枚举来实现java单例模式

接下来,让我们通过反射 invoke 一下他的构造方法看看会发生什么:

constructor.newInstance();

结果如下:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects at java.lang.reflect.Constructor.newInstance(Constructor.java:417)

通过看 newInstance 方法代码的话,就很容易知道原因了:

public T newInstance(Object ... initargs)        throws InstantiationException, IllegalAccessException,               IllegalArgumentException, InvocationTargetException    {//加入Java开发交流君样:756584822一起吹水聊天        ...        if ((clazz.getModifiers() & Modifier.ENUM) != 0)            throw new IllegalArgumentException("Cannot reflectively create enum objects");        ...        T inst = (T) ca.newInstance(initargs);        return inst;    }

java 的反射 API 在创建对象实例是判断了当前类是否是枚举类型,否则就抛异常出来。

到此,关于“如何使用枚举来实现java单例模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何使用枚举来实现java单例模式

本文链接: https://www.lsjlt.com/news/298333.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用枚举来实现java单例模式
    这篇文章主要介绍“如何使用枚举来实现java单例模式”,在日常操作中,相信很多人在如何使用枚举来实现java单例模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用枚举来实现java单例模式”的疑惑有所...
    99+
    2023-06-20
  • java中枚举如何实现单例模式
    java中枚举实现单例模式的方法:可以使用单元素枚举类型实现,语法格式:“public enum Singleton {INSTANCE; private Singleton() {}}”,一般情况下枚举里面创建实例是线程安全的。用法说明:...
    99+
    2022-10-24
  • 怎么使用java枚举实现单例模式
    这篇文章主要介绍了怎么使用java枚举实现单例模式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用java枚举实现单例模式文章都会有所收获,下面我们一起来看看吧。用法说明:在功能上类似于 public 字...
    99+
    2023-07-04
  • 一篇文章教你使用枚举来实现java单例模式
    目录传统的单例写法解决了什么问题仍然存在的问题为什么枚举就没有问题总结传统的单例写法解决了什么问题 首先,在大多数情况下(不包含面试),传统的单例写法已经完全够用了。通过 synch...
    99+
    2022-11-12
  • 怎么在java中使用枚举实现单例
    怎么在java中使用枚举实现单例?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. ...
    99+
    2023-06-14
  • JAVA 枚举单例模式及源码分析的实例详解
    JAVA 枚举单例模式及源码分析的实例详解      单例模式的实现有很多种,网上也分析了如今实现单利模式最好用枚举,好处不外乎三点:线程安全不会因为序列化而产生新实例防止反射攻击但是貌似没...
    99+
    2023-05-31
    java 枚举 单例
  • java单例模式如何实现
    本篇内容主要讲解“java单例模式如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java单例模式如何实现”吧!0x01 宫女请安在朕的后宫中,皇后当之无愧的是天下第一(朕只能当...
    99+
    2023-06-19
  • Java的单例模式如何实现
    这篇文章主要介绍“Java的单例模式如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java的单例模式如何实现”文章能帮助大家解决问题。什么是单例模式单例模式(Singleton Patter...
    99+
    2023-06-27
  • Java设计模式的单例模式如何实现
    这篇文章主要介绍了Java设计模式的单例模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的单例模式如何实现文章都会有所收获,下面我们一起来看看吧。单例模式单例模式顾名思义就是单一的实例...
    99+
    2023-06-29
  • java设计模式中如何实现单例模式
    这篇文章将为大家详细讲解有关java设计模式中如何实现单例模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是一个简单的小实例://简单懒汉式 public class ...
    99+
    2023-05-30
    java
  • 如何使用Javascript实现单例模式
    这篇文章给大家分享的是有关如何使用Javascript实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScri...
    99+
    2023-06-14
  • 如何实现单例模式
    本篇文章给大家分享的是有关如何实现单例模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。header("Content-type:t...
    99+
    2022-10-19
  • java单例模式如何实现面板切换
    这篇文章主要为大家展示了“java单例模式如何实现面板切换”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java单例模式如何实现面板切换”这篇文章吧。具体内容如下首先介绍一下什么是单例模式:  ...
    99+
    2023-05-30
    java
  • 如何使用Python继承实现单例模式
    这篇文章给大家分享的是有关如何使用Python继承实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。继承实现:class ParentClass:    ...
    99+
    2023-06-17
  • 如何使用Python元类实现单例模式
    这篇文章主要介绍了如何使用Python元类实现单例模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。元类实现:class MetaClass(type): ...
    99+
    2023-06-17
  • JavaScript如何实现单例模式
    小编给大家分享一下JavaScript如何实现单例模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单例模式通过 ES6 的 Proxy 拦截构造函数的执行方法来...
    99+
    2023-06-27
  • PHP单例模式如何实现
    这篇文章主要介绍“PHP单例模式如何实现”,在日常操作中,相信很多人在PHP单例模式如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP单例模式如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • Android如何实现单例模式
    这篇文章主要介绍了Android如何实现单例模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.饿汉式public class SingletionSt...
    99+
    2023-06-15
  • 基于Java利用static实现单例模式
    目录一、之前旧的写法二、static代码块的效果三、单例的另一种写法四、总结一、之前旧的写法 class Singleton{     private Singleton() {} ...
    99+
    2022-11-12
  • 如何使用单例模式
    这篇文章主要讲解了“如何使用单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用单例模式”吧!饿汉式饿汉式是最常见的也是最不需要考虑太多的单例模式...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作