在日常编码中少不了使用枚举类,可以避免大量的魔法值和重复使用的问题。
但是过多的枚举类也会导致查找起来的麻烦。因此个人建议使用内部类的方式,将大量的枚举都可以写在一个Class中,很爽,用过都说好。
本文提供一些简单的枚举类的使用代码范例。话不多说,先上代码。
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Const {
// 常用数字常量
public final static String ONE_STR = "1";
public final static Integer ONE_INT = 1;
public final static String ZERO_STR = "0";
public final static Integer ZERO_INT = 0;
public final static Integer ONE_INT_MINUS = -1;
public final static Double ZERO_DOU = 0D;
public final static String ZERO_DOU_STR = "0.00";
public final static Long ONE_LONG = 1L;
// 常用字符常量
public final static String SEMICOLON = ";";
public final static String AND_SIGN = "&";
public final static String EQUAL_SIGN = "=";
// 转义后是 | 标志
public final static String UPRIGHT = "\\|";
// 常用常量
public final static String SUCCESS = "success";
public final static String SYS = "sys";
public final static String FAIL = "fail";
public final static String REFUND = "Refund";
public final static String SET = "set";
public final static String GET = "get";
/**
* 订单状态枚举
*/
@AllArgsConstructor
@Getter
public enum OrderTypeMaps {
COMMON(1, "正常单子"),
REFUND(2, "退票单子"),
CHANGE(3, "改签单子"),
;
private Integer code;
private String desc;
}
/**
*支付类型、支付名称映射表
*/
@AllArgsConstructor
@Getter
public enum PayTypeAndName {
alipay("alipay", "支付宝"),
wechatpay("wechat", "微信"),
;
private String payType;
private String accountName;
public static PayTypeAndName getEnum(String accountName) {
return Stream.of(PayTypeAndName.values())
.collect(Collectors.toMap(PayTypeAndName::getAccountName, Function.identity()))
.get(accountName);
}
}
/**
* 操作历史的操作内容模板
* {@link java.text.MessageFormat#format(Object)}
*/
@AllArgsConstructor
@Getter
public enum PushLogContent {
NEW_RECORD_LOG("新增{0}记录"),
;
private String content;
}
另外的建议如代码所示,使用 lombok提供的一些注解,省事且快乐,爱了。
还可以编写一些静态方法,根据code值或者其他字段取出相应的枚举,采用了java8的流式写法,说到底也就是个循环,换汤不换药,不懂得铁子们可以直接复制粘贴哦。
最后还放了一个MessageFormat 类的方法,简单介绍一下,{0}是一个带下标的占位符,使用 MessageFormat.format(str,param…) 方法可以将字符串中的占位符替换为后续参数,与String.format功能相似,但是效率更好一些。但是该方法会有精度丢失的问题,尽量不要将Long类型的值存入,无论是否是字符串,与其底层有关
public void messageFormat() {
String string = String.format("name=%s, age=%d", "huhx", 25);
String message = MessageFormat.format("name={1}, age={0}, {1}", 25, "huhx");
System.out.println(string);
System.out.println(message);
}
// name=huhx, age=25
// name=huhx, age=25, huhx