前人所做的 java中枚举类型的自增:
链接 : https://www.h5w3.com/177055.html
1 enum MSG_TYPE { 2 MSG_LOGIN(500), 3 MSG_LOGOUT, 4 MSG_REGISTER, 5 MSG_SEARCH, 6 MSG_ADD(600); 7 8 private int value; 9 10 private static int nextValue; 11 12 MSG_TYPE(){ 13 this(Counter.nextValue); 14 } 15 16 MSG_TYPE(int value){ 17 this.value = value; 18 Counter.nextValue = value + 1; 19 } 20 21 public int getValue() 22 { 23 return value; 24 } 25 26 private static class Counter 27 { 28 private static int nextValue = 0; 29 } 30 }
该方法改造为自动自增需要增加一个静态属性nextValue 和静态类Counter。
由于我在使用自增时有多个枚举类需要用到自增功能,这个功能有复用的可能。
就想着做一个枚举类共享的工具类暂存各个枚举类的下标。
这个工具类就像Oracle数据库中的序列一样,本来枚举类就像是java中的做的一个简易版的数据库中的表一样,那为表做一个自增序列类就好像更有意义一点了。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 /** 5 * 枚举类型中含有自增字段时的工具接口 6 * @author zkk 7 */ 8 public class IdentityEnum { 9 10 /** 11 * 根据类型为不同类型的对象保存自己的下标 12 */ 13 private static final Map<Class<?>, Integer> ENUM_INDEX_MAP = new HashMap<>(); 14 15 16 /** 17 * 获取某一对象的类型的自增下标 18 * @param object 对象 19 * @param identity 初始值 20 * @param step 步长 21 * @return 对象在本接口中的下标 22 */ 23 public static int getIndex(Object object, int identity, int step) { 24 Class<?> objectClass = object.getClass(); 25 if (!ENUM_INDEX_MAP.containsKey(objectClass)) { 26 ENUM_INDEX_MAP.put(objectClass, identity); 27 } else { 28 ENUM_INDEX_MAP.put(objectClass, ENUM_INDEX_MAP.get(objectClass) + step); 29 } 30 return ENUM_INDEX_MAP.get(objectClass); 31 } 32 33 /** 34 * 获取某一对象的类型的自增下标 35 * @param object 对象 36 * @param reSetIdentity 重设初始值 37 */ 38 public static void setIndex(Object object, int reSetIdentity) { 39 Class<?> enumObjectClass = object.getClass(); 40 ENUM_INDEX_MAP.put(enumObjectClass, reSetIdentity); 41 } 42 /** 43 * 获取某一对象的类型的自增下标 44 * @param object 对象 45 * @return 对象在本接口中的下标 46 */ 47 public static int getIndex(Object object) { 48 return getIndex(object,0,1); 49 } 50 51 }
为了调用方便,这里我使用枚举类的类型作为序列自增类的key。
如要对同一个枚举类型的不同字段分别设定自增的话,
需要对IdentityEnum.java做一定的改造,
如有其他非常规自增,也可直接在这个类中改造。
调用时代码:
1 import java.math.BigDecimal; 2 3 /** 4 * excel模板对应的列 5 * @author zkk 6 */ 7 public enum ExcelColumn { 8 /** 9 * 职员姓名 10 */ 11 EMPLOYEE_NAME(String.class), 12 /** 13 * 职员工号 14 */ 15 EMPLOYEE_NO(String.class), 16 /** 17 * 税额 18 */ 19 TAX_AMOUNT(5,BigDecimal.class), 20 /** 21 * 金额 22 */ 23 AMOUNT(BigDecimal.class); 24 25 /** 26 * 列的序号 27 */ 28 public int index; 29 30 /** 31 * 列类型对应的的java数据类型 32 */ 33 public Class columnJavaType; 34 35 ExcelColumn(Class columnJavaType) { 36 //获取并自动更新序号 37 this.index = IdentityEnum.getIndex(this); 38 this.columnJavaType = columnJavaType; 39 } 40 41 ExcelColumn(int index, Class columnJavaType) { 42 this.index = index; 43 //更新序号 44 IdentityEnum.setIndex(this,3); 45 this.columnJavaType = columnJavaType; 46 } 47 }
使用这个自增工具类也可以在枚举类型中设定某个字段自增,对非自动化自增枚举类的改造时更方便
由于枚举类型获取类型的所有值的列表时是调用 values() 方法,故我称枚举类型的某行数据为value
经我观察枚举类的构造是根据类开始的第一个分号:【;】之前的各value及其后括号里的参数顺序及其类型,作为调用构造方法的依据。
所有的枚举类的属性和构造方法及其他方法都应放在第一个分号【;】之后。
第一次获取某个value时,会按代码中写的value的顺序依次执行第一个分号前的各个value的对应构造方法。
↑↑↑这是实现枚举类型自增的基础:按行依次执行对应的构造方法。