ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-08 01:33:57  阅读:147  来源: 互联网

标签:自增 java int object value 枚举 类型


前人所做的 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,int,object,value,枚举,类型
来源: https://www.cnblogs.com/catchException/p/16353930.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有