enum 中的一些坑

 话不多少抛问题:

我定义enum :

@AllArgsConstructor
@NoArgsConstructor
@Getter
public enum ValidationExceptionCodeEnums {

    SCOOTERID_IS_EMPTY(1001, "scooterId 为空"),

    EVENT_IS_EMPTY(1002, "事件 为空"),

    LONGITUDE_IS_EMPTY(1003, "经度为空"),

    LATITUDE_IS_EMPTY(1004, "维度为空"),

    ACTION_RESULT_IS_EMPTY(1005, "Action 结果为空"),

    GEOHASH_IS_EMPTY(1006, "geohash为空"),

    BATTERY_IS_EMPTY(1007, "电量为空"),

    BEGINTIME_IS_EMPTY(1008, "开始时间为空"),

    ENDTIME_IS_EMPTY(1009, "结束时间为空"),

    DESTINATION_IS_NOT_EMPTY(1010, "目的地为空"),

    DESTINATION_LATITUDE_IS_NOT_EMPTY(1011, "目的地经度为空"),

    DESTINATION_LONGITUDE_IS_NOT_EMPTY(1012, "目的地 维度为空"),

    SCOOTER_STATUS_IS_EMPTY(1013, "scooter 状态为空"),

    REPAIR_TYPE_IS_EMPTY(1014, "维修类型为空"),

    BOOKTIME_IS_EMPTY(1015, "预约时间为空"),

    REPAIT_SCOOTER_STATUS_IS_EMPTY(1016, "维修sooter的状态为空"),

    SCOOTER_LICENSE_IS_EMPTY(1017, "车牌号为空"),

    SCOOTER_LICENSE_PICTURE_IS_EMPTY(1018, "车牌号图为空"),

    SCOOTER_LICENSE_TIME_IS_EMPTY(1019, "上牌时间为空")
    ;
    private int code;

    private String message;


    public static ValidationExceptionCodeEnums getErrorCodeByCode(int code) {
        for (ValidationExceptionCodeEnums item : ValidationExceptionCodeEnums.values()) {
            if (item.getCode() == code) {
                return item;
            }
        }
        return null;
    }
}

对入参对象进行参数过滤:

提示我 必须是常量!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

 大佬们 有没有更好的解决方案 , 规避掉。

 

找到如下原因:


上回书说enum类型天生是final和static的。Java中的常量,我们知道也一般定义为static final。例如:

1
private static final int intConstant = 1;

 

上面这行代码中,变量intConstant就是一个常量,常量意味着intConstant的值在编译时就能够确定,并且无法改变。
这样听起来被定义为static final的变量就能称之为常量了啊,enum天生就是static final的,enum天生就是常量啦?

答案是,不一定哦~
发现问题
今天在使用mybatis写一个dao, 像之前每天做的工作一样,写一个简单的select语句。写的select语句中where子句中有个判断字段status,这个字段被定义为int,每一个int值对应一个状态。在以前,我会这样写这个sql语句。

1
2
@Select(Select column1, column2 from sample_table where status = 1 or status =2)
	public List<SampleTable> getSampleData();

 

现在,我慢慢学会使用enum了,于是我打算把status的状态用enum来表示。于是我开始这样写代码。

1
2
3
4
5
6
7
8
9
private enum SAMPLE_STATUS{
    STATUS1(1), STATUS2(2);
    private int value;
    private SAMPLE_STATUS(int value){
    this.value = value
    };
}
@Select(Select column1, column2 from sample_table where status = SAMPLE_STATUS.STATUS1.value or status =SAMPLE_STATUS.STATUS2.value)
	public List<SampleTable> getSampleData();

 

可是,我这样写代码后@Select那行编译器报错: “attribute value must be constant“.

为什么啊,enum不是static final的吗?不应该是常量吗?为什么提示我说这个属性必须是常量呢?

分析问题
出现了这样的错误,我很好奇。重新看了下自己的代码,并进行了一番谷歌之后,我突然醒悟了。我tm太傻逼了。
真相应该是enum是天生static final没错,所以SAMPLE_STATUS.STATUS1是常量,但是,SAMPLE_STATUS.STATUS1对应的这个值就不一定是了。因为这个int值是在enum的构造器中初始化的,也就是说,SAMPLE_STATUS.STATUS1对应的int值,应该是在enum类被加载的时候才被赋值,编译时还没有被赋值。

为了验证我的想法,我写了下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private enum Fruit{
        Strawberry(1), Banana(2), Kiwi(3);
        private int value;
        private Fruit(int value){
            System.out.println("The value is " + value);
            this.value = value;
        }
    }

    public static void main(String [] args)  {
        int value = Fruit.Strawberry.value;
        System.out.println("The value of strawberry is " + value);
        Fruit.Strawberry.setValue(3);
        System.out.print("The value of strawberry is " + value);
    }

 

上面的代码运行的结果是:

1
2
3
4
5
The value is 1
The value is 2
The value is 3
The value of strawberry is 1
The value of strawberry is 1

 

前三行输出结果说明,当enum类加载的时候,会依次调用构造器,生成不同的枚举类实例,实例对应的int值也依次被初始化。
后两行输出结果说明,被初始化后的int值也是final的,不可被修改,尽管我调用了setValue方法,试图改变其int的值。

解决问题
既然enum对应的int值不是常量,我还是想用enum类型去表示我的sql语句中的status字段的值,咋办呢?

1
2
3
4
5
6
7
8
9
@SelectProvider(type = Provider.class, method = "getSampleData")
	public List<SampleTable> getSampleData();
	
	public static class Provider {
	public static String getSampleData(){
			
			return "Select column1, column2 from sample_table where status =" + SAMPLE_STATUS.STATUS1.value + "or status =" + SAMPLE_STATUS.STATUS2.value;
		}
	}

 

注解中要求所有的值必须是常量,但是class中没有这样的要求。
所以,使用Provider可以完美的解决这个问题。

来自:原贴

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Pythonenum是一个用于定义枚举类型的模块。使用enum可以更好地管理和表示一组固定的值。在Python,可以使用标准库提供的Enum类来定义枚举类型。可以通过导入enum模块并继承Enum类来定义枚举类型。例如,可以定义一个Color枚举类,其包含red、green和blue三个枚举值。\[1\] 此外,还可以使用IntEnum类来定义整数枚举类型。IntEnumEnum的扩展,可以用于不同类型的整数枚举之间的比较。例如,可以定义一个Shape枚举类,其包含circle和square两个枚举值,以及一个Request枚举类,其包含post和get两个枚举值。可以通过比较枚举值来进行判断,例如Shape.circle == 1会返回True。\[2\] 枚举类型的定义使用class语法,这种方式易读易写。可以通过定义一个继承自Enum的子类来定义枚举类型。例如,可以定义一个Color枚举类,其包含RED、GREEN和BLUE三个枚举值。\[3\] #### 引用[.reference_title] - *1* *2* [Python学习笔记——Enum(枚举)类](https://blog.csdn.net/Granery/article/details/87827565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Python】枚举的定义和使用(enum)](https://blog.csdn.net/qq_42951560/article/details/119542971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值