做单屏网站 高度是多少,网络科技工作室起名,保健品 东莞网站建设,学校门户网站作用【README】
1#xff0c;effectivejava 讲到使用 枚举类实现单例的例子#xff0c;非常好用#xff1b;2#xff0c;好处如下#xff1a; 不用定义私有构造器#xff1b;不用定义获取单例的方法#xff0c;如 getInstance() #xff1b;通过 枚举类.INSTANCE() 就可以…【README】
1effectivejava 讲到使用 枚举类实现单例的例子非常好用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 ConcurrentMapString, 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\srcjavap com.cmc.vw.javaoop.enumtest.PPKafkaManager
Compiled from PPKafkaManager.java
public final class com.cmc.vw.javaoop.enumtest.PPKafkaManager extends java.lang.Enumcom.cmc.vw.javaoop.enumtest.PPKafkaManager {public static final com.cmc.vw.javaoop.enumtest.PPKafkaManager INSTANCE;public final java.util.concurrent.ConcurrentMapjava.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的反编译结果发现枚举类构造器是私有 我们发现
1PPKafkaManager 枚举类 编译后是一个 final 类所以它是不能被继承的2PPKafkaManager 枚举类 继承自 Enum 类3枚举类实例 INSTANCE 是一个static final 静态常量仅有一份所以可以直接引用4 枚举类 PPKafkaManager 默认为私有构造器
【1.2.2.】查看 Enum构造器
1类定义
public abstract class EnumE extends EnumEimplements ComparableE, Serializable {
2Enum 只有一个构造器如下
protected Enum(String name, int ordinal) {this.name name;this.ordinal ordinal;
}
很显然 这个构造器是 protected访问权限是 同包下或其子类又因为 INSTANCE 被final修饰所以它不能被继承即没有子类 总结下
1Enum枚举子类的类被final修饰所以无法被子类继承2构造器默认为private所以不能被其他类实例化3通过反射也是无法实例化枚举类的4线程安全因为枚举类实例 被 static final修饰主程序启动时枚举类实例就已经加载到内存了
以上枚举类天然满足单例类的条件且代码更加简单