Java教程

java 为 枚举类型euum 的 某个int(Integer)字段做自增 Identity

本文主要是介绍java 为 枚举类型euum 的 某个int(Integer)字段做自增 Identity,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前人所做的 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的对应构造方法。

↑↑这是实现枚举类型自增的基础:按行依次执行对应的构造方法。

 

这篇关于java 为 枚举类型euum 的 某个int(Integer)字段做自增 Identity的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!