定义
JDK1.5 及之后版本新增 enum 关键字用于定义枚举类
自定义枚举类步骤
- 私有化构造器
- 类的内部定义public static final 枚举类对象
普通类:
public class Season1 {
private final String seasonName;
private final String seasonDesc;
//1 私化构造器
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//2 类的内部创建对象
public static final Season1 SPRING = new Season1("春天", "春眠不觉晓");
public static final Season1 SUMMER = new Season1("夏天", "处处蚊子咬");
public static final Season1 AUTUMN = new Season1("秋天", "秋天叶子黄");
public static final Season1 WINTER = new Season1("冬天", "冬天雪花飘");
}
enum类:
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER;
}
枚举的规则
- 枚举类的属性应该使用private final修饰
- 枚举类的构造器只能使用private 访问控制修饰符
- 枚举类的所有实例必须在枚举类内部显示创建,系统会自动添加public static final
- 在枚举类中,对象由public static final 修饰,所以要使用对象,应该用类名.对象
枚举类的主要方法
- Enum[] values()方法
for (AuthStatusEnum enumData : AuthStatusEnum.values()) {
if (enumData.getValue().equals(value)) {
return enumData;
}
}
- valueOf(String str)
把一个字符串转为枚举类的对象。
要求字符串必须与枚举类对象名字相同,才可传为枚举类对象。
ValidateCodeType.valueOf(type).getParamNameOnValidate()
枚举类在switch的使用
可以在 switch 表达式中使用枚举类的对象作为表达式,
case 子句可以使用枚举的对象引用作为判断条件!
综合运用:提供多个value
package com.rttx.user.api.enums;
import com.rttx.mobile.util.validation.CheckedException;
/**
* 类名称:AuthStatusEnum 类描述: 1:未进行任何认证 2:身份证已认证 3:人脸已认证
* @version 1.0
*/
@Data
public enum AuthStatusEnum {
NOT_AUTH("authed", "1", "未进行任何认证"),
AUTH_ID("authing", "2", "身份证已认证"),
AUTH_FACE("authFalure", "3", "人脸已认证");
private String name;
private String value;
private String label;
AuthStatusEnum(String name, String value, String label) {
this.name = name;
this.value = value;
this.label = label;
}
public static String getLabel(String value) {
try {
return getEnum(value).getLabel();
} catch (CheckedException e) {
// 不存在
}
return "";
}
/**
* 根据枚举值获取 AuthStatusEnum
*/
public static AuthStatusEnum getEnum(String value) throws CheckedException {
for (AuthStatusEnum enumData : AuthStatusEnum.values()) {
if (enumData.getValue().equals(value)) {
return enumData;
}
}
throw new CheckedException(String.format("传入的枚举值不存在,AuthStatusEnum:%s", value));
}
}
- 使用方式
NOT_AUTH.getLabel(String value)
AuthStatusEnum getEnum(String value)
综合运用:提供单个value——>定义抽象方法
- 背景:
偶然在代码中看到枚举中定义了抽象方法,觉得很奇怪。以前从来没有想过还可以这么用,真是涨姿势。
public enum Animal {
CAT {
public String makeNoise() { return "MEOW!"; }
},
DOG {
public String makeNoise() { return "WOOF!"; }
};
public abstract String makeNoise();
}
-
参考自:http://stackoverflow.com/questions/7413872/can-an-enum-have-abstract-methods
-
思考:枚举是一个类,并且是私有化构造器的类(是不是很像抽象类),所以他可以定义抽象方法
而其内部的对象,当然要实现其定义的抽象方法; -
实际运用如下
package com.dodou.scaffold.mq.enums;
/**
* @author: Lwh
* @ClassName: AmqpQueue
* @Description:
* @version: 1.0.0
* @date: 2019-03-21 10:28 AM
*/
public enum AmqpQueue {
RELEASE {
@Override
public String getQueueName() {
return "release.que";
}
};
private String value;
AmqpQueue() {
}
AmqpQueue(String value) {
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public abstract String getQueueName();
}
枚举类实现接口
public interface Operator {
int apply (int a, int b);
}
public enum SimpleOperators implements Operator {
PLUS {
int apply(int a, int b) { return a + b; }
},
MINUS {
int apply(int a, int b) { return a - b; }
};
}
public enum ComplexOperators implements Operator {
// can't think of an example right now
}
网友评论