开发者

Java: How to modify value of current enum inside of its type definition?

开发者 https://www.devze.com 2023-01-09 09:36 出处:网络
I defined an enum type that implements an interface as follows: public enum MyEnum implements MyInterface

I defined an enum type that implements an interface as follows:

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 curren开发者_StackOverflowt enum?
    }

}

How do I access the value of the current enum object so I can make the assignment inside of readFromParcel() ? (Please see comment in code)


Inside an instance method, you can refer to the "current enum object" as simply this. It works this way because enum constants are actual objects, i.e. instances of a class -- a very special type of class, but a class nonetheless. (Note that I mentioned that these are enum constants: it is the convention in Java to use all uppercase letters when naming constants.)

Your usage of values() is also very peculiar (not to mention that it'll perform horribly since a new array must be constructed at each call). Perhaps you'd want to take a look at EnumMap, which is a special kind of Map optimized for enum constants as keys.

If you're trying to mutate fields contained in these enum constants, then you should seriously consider a redesign. You should generally minimize mutability anyway, but having these static singletons be mutable does not sound like a good design. Instead of having these mutable fields intrinsic within the enum constants themselves, a Map from the constants to these mutable values would be a much better design.

See also

  • Java Tutorials/enum
  • Effective Java 2nd Edition
    • Item 15: Minimize mutability
    • Item 31: Use instance fields instead of ordinals
    • Item 32: Use EnumSet instead of bit fields
    • Item 33: Use EnumMap instead of ordinal indexing

Various questions on Java enum

  • Configurable Values in Enum
  • How to efficiently use Enum objects as keys in the Map data structure?
  • Is there a a C-like way to get item number from enum in java ? (yes, but why would you???)
  • Get enum by its inner field


Enums are immutable, so you cannot. Your best be is to make readFromParcel static and have it return an enum. So, something like this:

    public static MyEnum readFromParcel(Parcel in)
    {
        MyEnum val = MyEnum.values()[in.readInt()];
        return val;
    }


It's really not a good idea to make enums mutable. However, the this for an enum is just this.

MyEnum val = this;

The actual fields val1, val2 and val3 (should be VAL1, VAL2 and VAL3) are implicitly public static final.


Use this.

if this.equals(val) {
     ...
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号