废话不多说系列,直接上代码!
(1)用于系统枚举同类常量
核心代码逻辑
- 根据
msg获取code; - 根据
code获取msg; - 根据
code获取枚举全部信息; - 判断是否存在对应的
code; - 判断是否存在对应的
msg;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
/**
* 核销状态枚举类
*/
public enum VerificationStatusEnum {
/**
* 待完成
*/
VERIFICATION_STATUS_NO("0", "待完成"),
/**
* 已完成
*/
VERIFICATION_STATUS_TODO("1", "已完成"),
/**
* 部分完成
*/
VERIFICATION_STATUS_PART("2", "部分完成"),
;
/**
* 编码
*/
private String code;
/**
* 编码含义
*/
private String msg;
VerificationStatusEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static String getCodeByMsg(String msg) {
if (Objects.isNull(msg)) {
return null;
}
VerificationStatusEnum[] arr = VerificationStatusEnum.values();
for (VerificationStatusEnum verificationStatusEnum : arr) {
if (msg.equals(verificationStatusEnum.getMsg())) {
return verificationStatusEnum.getCode();
}
}
return null;
}
public static String getMsgByCode(String code) {
if (Objects.isNull(code)) {
return "";
}
VerificationStatusEnum[] arr = VerificationStatusEnum.values();
for (VerificationStatusEnum verificationStatusEnum : arr) {
if (code.equals(verificationStatusEnum.getCode())) {
return verificationStatusEnum.getMsg();
}
}
return "";
}
public static VerificationStatusEnum getByCode(String code) {
if (Objects.isNull(code)) {
return null;
}
VerificationStatusEnum[] arr = VerificationStatusEnum.values();
for (VerificationStatusEnum verificationStatusEnum : arr) {
if (code.equals(verificationStatusEnum.getCode())) {
return verificationStatusEnum;
}
}
return null;
}
public static Boolean isHasCode(String code) {
if (Objects.isNull(code)) {
return false;
}
return !StringUtils.isBlank(getMsgByCode(code));
}
public static Boolean isHasMsg(String msg) {
if (StringUtils.isBlank(msg)) {
return false;
}
return !Objects.isNull(getCodeByMsg(msg));
}
}
扩展:公共返回状态码
package com.study.module.springbootapilock.enums;
import java.util.Arrays;
import java.util.Objects;
public enum CommonCode {
/**
* 成功
*/
SUCCESS(true, 200, "操作成功!"),
/**
* 失败
*/
FAIL(false, 500, "操作失败!"),
/**
* 未找到相关内容
*/
NO_FIND(false, 500, "未找到相关内容!"),
;
/**
* 操作是否成功
*/
private Boolean flag;
/**
* 操作代码
*/
private Integer code;
/**
* 提示信息
*/
private String message;
CommonCode(Boolean flag, Integer code, String message) {
this.code = code;
this.flag = flag;
this.message = message;
}
public static String getMsgByCode(Integer code) {
if (Objects.isNull(code)) {
return "";
}
CommonCode[] arr = CommonCode.values();
return Arrays.stream(arr).filter(commonCode -> code.equals(commonCode.getCode())).findFirst().map(CommonCode::getMessage).orElse("");
}
public static CommonCode getByCode(Integer code) {
if (Objects.isNull(code)) {
return null;
}
CommonCode[] arr = CommonCode.values();
return Arrays.stream(arr).filter(commonCode -> commonCode.getCode().equals(code)).findFirst().orElse(null);
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
(2)用于多线程安全方法存放
相关文章:Java枚举单例模式比DCL和静态单例要好?———反编译分析单例枚举类_砖业洋__-CSDN博客_最好的单例模式
① 双重校验锁单例(DCL)
public class Singleton {
// volatile 禁止重排序
private static volatile Singleton singleton;
// 将构造器私有化
private Singleton(){}
// 核心内容 Double Check Lock.(DCL)优点:不仅线程安全,而且延迟加载。
public static Singleton getInstance(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
相关注意事项:
singleton为何要加上 volatile 关键字?singleton = new Singleton();不是一个原子操作;volatile主要是限制 JIT 编辑器优化,编译器优化常用方法(将内存变量缓存到寄存器,调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。)
② 静态内部类单例
public class Singleton {
private Singleton(){}
private static class SingletonInstance {
private static Singleton singleton = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.singleton;
}
}
- 与 饿汉式的区别在于:类加载的时候,这里并不会实例化对象,只有调用
getInstance方法才会实例化对象。 - 与
DCL优点一样:延迟加载,效率高。
【①DCK】 和 【②静态单例】 都不错。但是他们并不能防止反序列化 和 反射生成多个实例。——更好地写法:枚举单例!
③ 枚举单例
JDK 1.5 添加地 枚举类来实现单例。可以有效的防止 反序列化 和发射破坏。
public enum Singleton {
INSTANCE,
public void testMethod() {
// do something.
System.out.println("执行了单例类的方法");
}
}
public class Test {
public static void main(String[] args) {
// 演示如何试用美剧写法的单例类
Singleton.INSTANCE.testMethod(); // 输出“执行了单例类的方法”
System.out.println(Singleton.INSTANCE); // 输出“INSTANCE”
}
}
这样写的优点:
- 不用考虑懒加载 和 线程安全 问题;
- 线程安全,代码写法简洁;
更多分析 枚举单例 的字节码文件 解析,见【相关文章】
至此,感谢阅读🙏!