用枚举enum实现单例

【README】

  • 1,effectivejava 讲到使用 枚举类实现单例的例子,非常好用;
  • 2,好处如下:
    • 不用定义私有构造器;
    • 不用定义获取单例的方法,如 getInstance() ;通过 枚举类.INSTANCE() 就可以获取单例了;少了很多代码;(枚举类满足单例天然的性质)

【1】枚举enum单例

【1.1】枚举类

/*** @Description kafka管理器* @author xiao tang* @version 1.0.0* @createTime 2021年11月19日*/
public enum PPKafkaManager {/** 单例 */INSTANCE;/** 缓存/kafka集群名-属性配置映射 */public final ConcurrentMap<String, Properties> kafkaConfigs = new ConcurrentHashMap<>();/*** @description 获取或添加属性配置* @param clusterName 集群名* @author xiao tang* @date 2021/11/19 */public Properties getOrCreate(String clusterName) {// 若存在,直接取走if (kafkaConfigs.containsKey(clusterName)) {return kafkaConfigs.get(clusterName);}// 新建kafka属性Properties newProps = create();Properties oldProps = kafkaConfigs.putIfAbsent(clusterName, newProps);// 若旧属性存在,则使用旧属性,丢弃新属性(注意关闭资源)if (oldProps != null) {// 这里注意关闭资源,其他业务场景可能这里还连接到了kafka集群newProps.clear();}return kafkaConfigs.get(clusterName);}/*** @description 新建kafka属性* @return kafka属性* @author xiao tang* @date 2021/11/19*/private Properties create() {// 其他属性加工逻辑return new Properties();}
}

我们发现,基于枚举实现的单例类,我们不用定义私有构造器,不用声明getInstance方法,因为 PPKafkaManager.INSTANCE 就可以引用单例


【1.2】枚举类构造器

【1.2.1】为啥枚举类可以没有私有构造器 ?

为此,我们反编译了  PPKafkaManager 类, 如下:

// 枚举类反编译结果 
D:\workbench_idea\study4vw\vwstudy01\src>javap com.cmc.vw.javaoop.enumtest.PPKafkaManager
Compiled from "PPKafkaManager.java"
public final class com.cmc.vw.javaoop.enumtest.PPKafkaManager extends java.lang.Enum<com.cmc.vw.javaoop.enumtest.PPKafkaManager> {public static final com.cmc.vw.javaoop.enumtest.PPKafkaManager INSTANCE;public final java.util.concurrent.ConcurrentMap<java.lang.String, java.util.Properties> kafkaConfigs;public static com.cmc.vw.javaoop.enumtest.PPKafkaManager[] values();public static com.cmc.vw.javaoop.enumtest.PPKafkaManager valueOf(java.lang.String);public java.util.Properties getOrCreate(java.lang.String);static {};
}

我们也可以查看 idea的反编译结果,发现枚举类构造器是私有

 

 我们发现

  • 1,PPKafkaManager 枚举类 编译后是一个 final 类,所以它是不能被继承的
  • 2,PPKafkaManager 枚举类 继承自 Enum 类
  • 3,枚举类实例 INSTANCE 是一个static final 静态常量,仅有一份;所以可以直接引用;
  • 4, 枚举类 PPKafkaManager 默认为私有构造器;

【1.2.2.】查看 Enum构造器

1)类定义

public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable {

2)Enum 只有一个构造器,如下:

protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;
}

很显然, 这个构造器是 protected,访问权限是 同包下或其子类,又因为 INSTANCE 被final修饰,所以它不能被继承,即没有子类

总结下:

  • 1,Enum枚举子类的类被final修饰,所以无法被子类继承;
  • 2,构造器默认为private,所以不能被其他类实例化;
  • 3,通过反射也是无法实例化枚举类的;
  • 4,线程安全,因为枚举类实例 被 static final修饰,主程序启动时,枚举类实例就已经加载到内存了;

以上,枚举类天然满足单例类的条件,且代码更加简单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试常考系列一

转载自 前端面试常考系列一 一、简述HTML5的优点和缺点&#xff1f; 优点&#xff1a; 1、网络标准统一、HTML5是由W3C推出的。 2、多设备、跨平台 &#xff0c;移植性强。 3、自适应网页设计。 4、即时更新。 5、新增了几个标签&#xff0c;有助于开发人员定义重要的内容&…

基于轻量型Web服务器Raspkate的RESTful API的实现

在上一篇文章《Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器》中&#xff0c;我们已经了解了Raspkate这一轻量型Web服务器&#xff0c;今天&#xff0c;我们再一起了解下如何基于Raspkate实现简单的RESTful API。 模块 首先让我们了解一下“模块”的概念。Raspkate的…

python股票自动买卖视频教程_十分钟学会用Python交易股票

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼本文通过讲述 [单股票均线策略] 在 Ricequant 量化平台的实现&#xff0c;熟悉平台并快速入门、创建自己的量化策略代码 。难易度&#xff1a;入门级.从一下几点说起&#xff1b;1 确定框架&#xff1a;[单股票均线策略] 的主要策略…

前端面试常考系列二

转载自 前端面试常考系列二 一、外部引用CSS有几种方式&#xff0c;有何区别 外部引用CSS的方式有两种分别是link和import。 区别如下&#xff1a; 1、link是XHTML标签&#xff0c;除了加载CSS外&#xff0c;还可以定义RSS等其它事务&#xff1b;import属于CSS范畴&#xff0c;…

3分钟看完Build2016 Day 1 Keynote

Build 2016 Day 1 Keynote 直播结束&#xff0c;M姐不得不说&#xff0c;没看直播的真心错过了一大波黑科技和充值我软信仰的大好时机&#xff0c;不过别后悔&#xff0c;M姐精选了干货&#xff0c;一次性让你补充信仰。没看的真心会被甩开八条街&#xff01;&#xff01; 言归…

js动态给按钮赋id_如何给SHOPIFY店铺添加“立即购买”动态结账按钮

动态结账按钮会根据店铺后台所支持的第三方快速结账付款方式和顾客设备浏览器的记录动态展示快速结帐按钮&#xff0c;比如PayPal Express Checkout、Apple Pay等。当然如果浏览器没有记录或者店铺后台没有支持的快速结帐付款方式&#xff0c;按钮则会显示为“buy it now”。Dy…

java序列化与深度拷贝

【README】 1&#xff0c; 为啥要序列化或序列化的意义&#xff1f;2&#xff0c;系统间调用的报文格式&#xff0c;大多数是Json字符串&#xff08;或字节数组&#xff09;&#xff1b;接收方接收json&#xff1b;3&#xff0c;但当系统调用如RMI&#xff0c;客户端请求服务器…

微软Build 2016开发者大会--兑换承诺

微软的Build开发者大会已经成为它向我们宣布其在未来一年里的战略方向的一个最大平台。不像苹果的发布大会&#xff0c;微软之所以要召开这个会议并不是要发布什么产品&#xff0c;而是像众多业内人士所分析的那样&#xff0c;希望通过介绍公司的努力来说服它最重要的听众——开…

前端面试常考系列三

转载自 前端面试常考系列三 一、简述一下src与href的区别 href 表示超文本引用&#xff0c;在 link和a 等元素上使用。src 表示来源地址&#xff0c;指向外部资源所在位置&#xff0c;在 img、script、iframe 等元素上。src 的内容&#xff0c;是页面的一部分&#xff0c;是引入…

java内部类小结

【README】 1&#xff0c;本文总结了java4种内部类&#xff0c;包括 成员内部类&#xff1a;在外部类内部定义的非静态类&#xff1b;成员内部类不能独立存在&#xff0c;如 UML中类间的组合关联关系&#xff1b;静态内部类&#xff1a;在外部类内部定义的静态类&#xff1b;…

python内置模块有哪些_python中那些小众但有用的内置模块

今天带来的是python里一些小众但是却比较实用的python库&#xff0c;一起来看看吧&#xff01;pprint&#xff1a;更清晰的打印pprint 是 pretty printer 的缩写&#xff0c;用来打印 Python 数据结构&#xff0c;与 print 相比&#xff0c;它打印出来的结构更加整齐&#xff0…

微软想让你跟机器人说句话就把事办了

也别猜错&#xff0c;微软可没有像 Google 一样打算让四只脚能跑 60 迈和两只脚能穿行森林的机器人大军占领你的家。他们家的机器人不是 Robot&#xff0c;而叫 Bot&#xff0c;可能是 chatbot 的简称&#xff0c;也就是聊天机器人。 具体来说&#xff0c;微软在自然语言处理的…

转:Spring Boot 获取 HttpServletRequest 的方法

转自&#xff1a; Spring Boot 获取 HttpServletRequest 的方法 - 简书本文介绍 Spring Boot 2 获取 HttpServletRequest 的方法。 目录 概述 方法Controller 方法参数属性自动注入手动方法调用借助 Mo...https://www.jianshu.com/p/b7a7d66c4ef2 本文介绍 Spring Boot 2 获取…

前端面试常考系列四

转载自 前端面试常考系列四 一、CSS盒子模型有哪些用处 css中的盒子模型是为了理解divcss模型的定位功能&#xff0c;它利用盒子模型这样的布局方式代替了传统的表格布局方式。盒子模型是在学习divcss布局方式中必须要学习的一个模型&#xff0c;通过这个模型可以明白网页中di…

python线性加权模型_局部加权之线性回归(1) - Python实现

1 #局部加权线性回归2 #交叉验证计算泛化误差最小点345 importnumpy6 from matplotlib importpyplot as plt789 #待拟合不含噪声之目标函数10 deforiFunc(x):11 y numpy.exp(-x) * numpy.sin(10*x)12 returny13 #待拟合包含噪声之目标函数14 def traFunc(x, sigma0.03):15 y …

3分钟看完 Day2 Keynote

hey~ M姐又给大家带来了满满惊喜的 Build2016 Day 2 Keynote 干货汇总了。 如果你连昨天的都还不知道&#xff0c;那真心就 out 了。如果说信仰在昨天充值爆棚&#xff0c;今天就要充值信仰到掀翻房顶的节奏了&#xff01;&#xff01;&#xff01; 红衣主教今天妥妥变身成为新…

latex 数学公式_技能分享——LaTeX篇I

公众号文章系列二——“小袁技能分享”上线啦&#xff0c;第一篇推文我们聊一聊LaTeX(音译 “拉泰赫”)Question 1什么是LaTeX&#xff1f;要解释LaTeX是什么&#xff0c;我们先要了解另外一个事物&#xff1a;TeX。1968年&#xff0c;美国著名计算机科学家、现代计算机科学的先…

转:springboot servlet使用配置

转自&#xff1a; springboot servlet使用配置_奔跑的蜗牛的博客-CSDN博客在spring boot中添加自己的Servlet有两种方法&#xff0c;代码注册Servlet和注解自动注册&#xff08;Filter和Listener也是如此&#xff09;。 一、代码注册通过ServletRegistrationBean 获得控制。 也…

前端面试常考系列五

转载自 前端面试常考五 一、DIV元素是什么 DIV元素是用来为HTML文档内大块&#xff08;block-level&#xff09;的内容提供结构和背景的元素。DIV的起始标签和结束标签之间的所有内容都是用来构成这个块的&#xff0c;其中所包含元素的特性由DIV标签的属性来控制&#xff0c;或…

从业十余年谈谈对dotnet看法与坚持

前言 园子经常在讨论关于.Net发展的问题&#xff0c;我也这些年在工作乃至创业过程中使用.Net碰到的一些问题和看法。个人擅长的技术面&#xff0c;C/C/MFC/STL、ASM、JAVA、VB、Javascript/Typescript、C#/WebForm/MVC、Android/MonoDroid,Linux/Windows&#xff0c;还有没有可…