【发布时间】:2017-05-06 11:21:17
【问题描述】:
我正在尝试这样做,以便我可以编辑枚举常量的名称。
我有这些课程:
public class MasterClass implements Serializable {
/**
*
*/
private static final long serialVersionUID = -7117733089486585811L;
private Sex sex;
public Sex getSex(){
return sex;
}
}
.
public class Sex implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4688254148082455942L;
private EnumModel model;
public String print(){
return model.name();
}
public static String print(String n){
return EnumModel.byName(n).name();
}
private static enum EnumModel {
MALE_1(1, 2, 3),
MALE_2(1, 2, 3),
FEMALE_1(1, 2, 3),
FEMALE_2(1, 2, 3)
;
private int x, y, z;
EnumModel(int...is){
x = is[0];
y = is[1];
z = is[2];
}
public static EnumModel byName(String n){
for (EnumModel a : EnumModel.values()){
if (n.toLowerCase().replaceAll(" ", "_").equalsIgnoreCase(a.name().toLowerCase()))
return a;
}
return null;
}
}
}
然后当我编辑枚举常量的名称之后,例如,如果我将 MALE_1 重命名为 MALE_ONE,那么我会得到这个错误:
Caused by: java.lang.IllegalArgumentException: No enum constant com.masterclass.sex.Sex.EnumModel.MALE_1
at java.lang.Enum.valueOf(Enum.java:238)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1750)
因为 MALE_1 显然不再存在,我唯一能解决这个问题的方法是删除保存的 MasterClass 并创建一个新的。
如何重命名常量而不出现此问题?
【问题讨论】:
-
使用您的 IDE 重命名它,它也会更新所有用法。
-
看起来您正在尝试读取序列化数据。如果 Class/Enum 不再与序列化数据匹配,这将不起作用。
-
我使用 Eclipse 的 refractor 工具,它给出了同样的错误
-
OP,您说您正在尝试更改枚举常量,但没有发布任何反映这一点的代码,所以我不明白您要做什么。
-
如果您想拥有可维护的持久存储,请不要重命名它们。这与重命名类或实例变量相同。持久化和重构不是好朋友。