【问题标题】:Java - Renaming Enum constantsJava - 重命名枚举常量
【发布时间】: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,您说您正在尝试更改枚举常量,但没有发布任何反映这一点的代码,所以我不明白您要做什么。
  • 如果您想拥有可维护的持久存储,请不要重命名它们。这与重命名类或实例变量相同。持久化和重构不是好朋友。

标签: java enums constants


【解决方案1】:

当您更改 Sex 类时更新它的 serialVersionUid 并编写一个自定义反序列化器 (readObject) 来检查版本并根据需要进行反序列化。见http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html

【讨论】:

  • 这真的是最好的选择吗?好像有点过分了
  • 你可以做任何你想做的事。如果您只想涵盖重命名,可以将枚举序列化为 int。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多