使用场景
我们一般用枚举来代表数字或者字符串,避免魔法值的产生。
有时需要根据数字或字符串获取到对应的枚举。
虽然可以在枚举里面写静态方法根据int获取对应的枚举也可以做到,但是你需要在一个枚举写一个方法,如果有N多个枚举则会非常的冗余
类似于这段代码
1 |
|
避免冗余代码,所以用到此工具类,用法就是所有的枚举需要实现此类即可进行使用
代码
一个枚举可以有多个标识
1 | import java.io.Serializable; |
一个枚举对应一个标识
util
1
2
3
4
5
6
7
8import java.io.Serializable;
// 单个变成数组util
public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
public static <T extends Serializable> T[] array(T... t) {
return t;
}
}代码复用、继承即可,最终还是调用一个枚举对应多个标识那个工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import ObjectUtils;
import java.io.Serializable;
import java.util.Optional;
public interface IEnum<T extends Serializable> extends IEnums<T> {
/**
* 获取枚举的标识
*/
T getIdentity();
// 默认实现获取多个标识
default T[] getIdentities() {
return ObjectUtils.array(getIdentity());
}
}
使用例子一
工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public enum ENV implements IEnums<String> {
RELEASE("release", "prod"),
PRE("pre"),
TEST("test", "test1", "test2", "test3"),
DEV("dev"),
LOCAL("local"),
;
private final String[] envs;
ENV(String... envs) {
this.envs = envs;
}
// 只要实现此方法即可
public String[] getIdentities() {
return envs;
}
}使用详情
1
2
3
4ENV env = IEnums.getEnum(ENV.class, "dev", RELEASE);
ENV test1 = IEnums.getEnum(ENV.class, "test1", RELEASE);
ENV test2 = IEnums.getEnum(ENV.class, "test2", RELEASE);
assert test1 == test2;
使用例子二
工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public enum UserType implements IEnum<Integer> {
NEW_USER(1, "新用户"),
OLD_USER(0, "老用户");
public final int code;
public final String doc;
UserType(int code, String doc) {
this.code = code;
this.doc = doc;
}
public Integer getIdentity() {
return code;
}
public String getDoc() {
return doc;
}
}使用详情
1
Optional<UserType> type = IEnums.getEnum(UserType.class, 1);
总结
在项目中,把我们的枚举统一归纳起来,所有的枚举实现此类接口。这样就可以直接爽快的使用了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 老曹的私房站!
评论