2017-05-06 79 views
1

我想让它,所以我可以编辑枚举常量的名称。Java - 重命名枚举常量

我有这些类:

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并创建一个新的。

如何在没有此问题的情况下重新命名常量?

+0

使用您的IDE重命名它,它也会更新所有用法。 – Bohemian

+0

看起来你想读取序列化数据。如果Class/Enum与序列化数据不匹配,这将不起作用。 – Tom

+0

我使用Eclipse的折射工具,它给出了相同的错误 –

回答

0

更新它时,更新serial类的serialVersionUid,并编写一个自定义的反序列化器(readObject),它会根据需要检查版本和反序列化。请参阅http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html

+0

这真的是最好的选择吗?看起来有点过分 –

+0

你可以做任何你想做的事。如果您只想覆盖重命名,则可以将枚举序列化为int。 –