枚举的概念与使用方法
为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?
这是枚举中定义常量的方法:
enum EnumTest {
//这些都是枚举EnumTest 的对象
MON, TUE, WED, THU, FRI, SAT, SUN;
}
//遍历所有的枚举常量
public class demo1 {
public static void main(String[] args) {
//返回具有指定名称的指定枚举类型的枚举常量。
System.out.println(EnumTest.valueOf("MON"));
for(EnumTest EnumTest : EnumTest.values()){
System.out.println(EnumTest);
}
}
}
这是通常定义常量的方法:
class EnumTest{
public final static String MON = "星期一";
public final static String TUE = "星期二";
public final static String WED = "星期三";
public final static String THU = "星期四";
public final static String FRI = "星期五";
public final static String SAT = "星期六";
public final static String SUN = "星期日";
}
能看出枚举不能直接定义具体的值,但是枚举类型提供了构造函数,我们可以通过构造函数和覆写toString 方法来实现
enum EnumTest {
MON("星期一",1),
TUE("星期二",2),
WED("星期三",3),
THU("星期四",4),
FRI("星期五",5),
SAT("星期六",6),
SUN("星期日",7);
private String description;
private int id;
EnumTest(String description, int id) {
//很容易理解我们这里需要什么数据类型就生成相应参数的构造方法
this.description = description;
this.id = id;
}
@Override
public String toString() {
return "EnumTest{" +
"description='" + description + '\'' +
", id=" + id +
'}';
}
}
public class demo1 {
public static void main(String[] args) {
for(EnumTest EnumTest : EnumTest.values()){
System.out.println(EnumTest.toString());
}
}
}
通过查看文档了解到enum 实现了comparable借口所以枚举类型本身是可以排序的通过代码来了解一下:
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
enum EnumTest{
MON,TUE,WED;
}
public class demo1 {
public static void main(String[] args) {
Set<EnumTest> set = new TreeSet<EnumTest>();
set.add(EnumTest.MON);
set.add(EnumTest.WED);
set.add(EnumTest.TUE);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
通过结果我们可以看出set集合自动排序了
package com.utcip.crm.common.constants;
import com.utcip.crm.common.base.process.ScheduleStatusEnum;
/**
* 合同变更存储mongodb 状态值
* @author jingfangnan
*
*/
public enum ConstractMongoStatus {
NEW(3,"新增"),
UPDATE(2,"修改"),
DELETE(1,"删除"),
GENERATOR(0,"普通无状态"),
// 是否提交审核
REVIEW(5,"提交审核"),
NO_REVIEW(-5,"不提交审核"),
//变更流程相关
ONLY_CONTRACT_MATERIAL(6,"仅涉及合同材料修改"),
NOT_ONLY_CONTRACT_MATERIAL(7,"需要合同档案部审核"),
CRM_ACC_EXPEN_CHANGE(8,"涉及实收款变更"),
NO_CRM_ACC_EXPEN_CHANGE(9,"不涉及实收款变更"),
//历史版本列表
UPDATE_PRODUCT(10,"变更商品"),
UPDATE_ACC_EXPEN(11,"变更实收款"),
UPDATE_RECEIVAL(20,"变更收款计划"),
UPDATE_ATTACHMENT(12,"变更附件"),
UPDATE_CONTRACT(13,"变更合同基本信息"),
UPDATE_APPROVAL(14,"变更审批单"),
//变更历史状态描述
MODIFY_NOMORE(19,"初始状态"),
MODIFY_UPDATE(15,"已更新"),
MODIFY_REVIEW_ING(16,"审核中"),
MODIFY_REVIEW_PASS(17,"审核通过"),
MODIFY_REVIEW_NO_PASS(18,"审核未通过")
;
private final Integer status;
private final String desc;
private ConstractMongoStatus(final Integer status,final String desc){
this.status = status;
this.desc = desc;
}
public static Integer getValue(Integer value) {
ConstractMongoStatus[] businessModeEnums = values();
for (ConstractMongoStatus businessModeEnum : businessModeEnums) {
if (businessModeEnum.status().equals(value)) {
return businessModeEnum.status();
}
}
return null;
}
public static String getDesc(Integer value) {
ConstractMongoStatus[] businessModeEnums = values();
for (ConstractMongoStatus businessModeEnum : businessModeEnums) {
if (businessModeEnum.status().equals(value)) {
return businessModeEnum.desc();
}
}
return null;
}
public Integer status(){
return this.status;
}
public String desc(){
return this.desc;
}
}
通过传入的数字获得对应的值:
public enum EnumRole {
FATHER(1,"爸爸"),
MOTHER(2,"妈妈"),
GRANDPA(3,"爷爷"),
GRANDMA(4,"奶奶"),
GRANDFATHER(5,"姥爷"),
GRANDMOTHER(6,"姥姥"),;
private final int id;
private final String description;
EnumRole(int id, String description) {
this.id = id;
this.description = description;
}
public int getId() {
return id;
}
public String getDescription() {
return description;
}
public static String getValue(int value) {
// values 表示得到全部的枚举内容 是编译器自动生成的方法,Enum中并没有该方法,返回包括所有枚举变量的数组。
for (EnumRole RoleType : EnumRole.values()) {
if (value == RoleType.getId()) {
return RoleType.getDescription();
}
}
return null;
}
}