Java:如何在其类型定义中修改当前枚举的值?

zer*_*lus 3 java

我定义了一个实现接口的枚举类型,如下所示:

public enum MyEnum implements MyInterface
{
    val1, val2, val3;
    private MyEnum() {}
    private MyEnum(Parcel in)
    {
        readFromParcel(in);
    }

    public void readFromParcel(Parcel in)
    {
        MyEnum val = MyEnum.values()[in.readInt()];
        // ??? How to I assign val to my current enum?
    }

}
Run Code Online (Sandbox Code Playgroud)

如何访问当前枚举对象的值,以便我可以在其中进行赋值readFromParcel()?(请参阅代码中的评论)

pol*_*nts 14

在实例方法中,您可以enum简单地引用"当前对象" this.它以这种方式工作,因为enum常量是实际的对象,即a的实例class- 一种非常特殊的类型class,但class仍然是.(请注意,我提到这些是enum常量:在命名常量时,使用全部大写字母是Java中的约定.)

你的使用values()也非常奇特(更不用说它会表现得非常糟糕,因为每次调用都必须构建一个新数组).也许你想看看EnumMap,这是一种特殊的Map优化enum常量作为键.

如果你试图改变这些enum常量中包含的字段,那么你应该认真考虑重新设计.你通常应该尽量减少可变性,但让这些static单例变得可变并不是一个好的设计.而不是在enum常量本身内部具有这些可变字段,Map从常量到这些可变值将是更好的设计.

也可以看看

  • Java教程/enum
  • 有效的Java第二版
    • 第15项:尽量减少可变性
    • 第31项:使用实例字段而不是序数
    • 第32项:使用EnumSet而不是位字段
    • 第33项:使用EnumMap而不是序数索引

关于Java的各种问题 enum