zer0stimulus
zer0stimulus

Reputation: 23606

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

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 current 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)

Upvotes: 3

Views: 31326

Answers (4)

polygenelubricants
polygenelubricants

Reputation: 383696

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

Upvotes: 14

Adrian Regan
Adrian Regan

Reputation: 2250

Use this.

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

Upvotes: 0

Devon_C_Miller
Devon_C_Miller

Reputation: 16518

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;
    }

Upvotes: 1

Tom Hawtin - tackline
Tom Hawtin - tackline

Reputation: 147134

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.

Upvotes: 0

Related Questions