关于java枚举类的疑惑

1.问题环境
有个自定义异常类(zrj-base-api包的AppException),这个类中有一个构造器的参数是枚举类.枚举类继承了(zrj-base-api包中的ErrorEnumInterface).属性是code和desc
spring+springboot
图片说明

2.问题描述
在某个流程中获取一个枚举实例,将枚举的desc属性重新赋值,

TaskRetEnums t = TaskRetEnums.SELECTION;
t.setDesc(t.getDesc+"  abc");

返回异常AppException,用带有枚举的构造器,

  throw new AppException(t);

此时返回的整体数据:

{
    "time": 1574843467478,
    "status": "6006",
    "message": "枚举desc原本内容  abc",
}

再触发一次这个流程返回的整体数据

{
    "time": 1574843467478,
    "status": "6006",
    "message": "枚举desc原本内容  abc  abc",
}

发现多了一个abc

3 疑惑
(1)这个枚举类是单例模式么?
(2)如何能让后边返回的数据只有一个追加内容(只有一个abc),最好是正面解决问题,就别是拼接字符串这样,让每个枚举类实例化后都是一个样子(不带追加的abc)

感谢各位大佬啦

-----------------------记录解决方式---------------------------------

图片说明

利用反射破坏枚举类的单例模式
像采纳答案老哥说的一样,常量和枚举类应该是最终的,不应该改变.

2个回答

判断一下t.getDesc.contains("abc")。是否包含abc包含的话则不在设置。

lppzyt
lppzyt 客气了,有疑问是好的啊,证明思考了,有疑问就解决疑问。这样进步就快了。
大约 2 个月之前 回复
yanjianpeng_2018
yanjianpeng_2018 回复lppzyt: 谢谢,问题昨天已经解决了,用了异常类的其他构造函数,主要是想明白怎么让这个东西用的时候是最开始定义的样子...今天因为问这个问题加了个群,然后让人家骂了...所以一定要搞清楚(。•ˇ‸ˇ•。)
大约 2 个月之前 回复
yanjianpeng_2018
yanjianpeng_2018 回复lppzyt: 是的大佬 构造器是私有的
大约 2 个月之前 回复
lppzyt
lppzyt 但这种只能在系统的所有地方调用一次,就是只能改一次。比如第一次增加的是abc,第二次想增加bcd则不行了。另外枚举值一般是常量,不建议用在可变的变量上。是否可以采取其它的形式
大约 2 个月之前 回复
lppzyt
lppzyt 枚举的构造函数发一下?枚举是单例的,改了内容之后再次调用就是改过之后的了。判断当前的枚举值的length是否大于最初的原始值的length
大约 2 个月之前 回复
yanjianpeng_2018
yanjianpeng_2018 追加的内容不是固定的呀 (。•ˇ‸ˇ•。)
大约 2 个月之前 回复

在下面这段中间加个flag判断条件跳过

TaskRetEnums t = TaskRetEnums.SELECTION;
t.setDesc(t.getDesc+"  abc");

在流程外加个int flag=0;

TaskRetEnums t = TaskRetEnums.SELECTION;
if(flag==0){
t.setDesc(t.getDesc+"  abc");
flag++;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问