2017-05-06 15 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_ONEにMALE_1の名前を変更した場合その後、私は列挙型定数の名前を編集するとき後、例えば、その後、私は、このエラーが発生します。

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

SexクラスのserialVersionUidを変更したときにそれを更新し、バージョンをチェックし、適切なものを逆シリアル化するカスタムデシリアライザ(readObject)を記述します。 http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html

+0

これは本当に最適なオプションですか?余計なことがあるようです –

+0

あなたは何でもできます。名前の変更のみをカバーする場合は、enumをintとしてシリアル化できます。 –

関連する問題