Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert parametized Enum to Enumerated Annotation in android

I have a question regarding to the andriod @IntDef Annotation. I know that in its basic usage, it should replace the enum. But what if I have a parameterized enum with multiple hardwired values for example

public enum MyEnum {
  YES(true, 1),
  NO(false, 0);


  private boolean boolState;
  private boolean intState;

  MyEnum(boolean boolState, int intState) {
    this.boolState = boolState;
    this.intState = intState;
  }

  public boolean getBoolState() {
    return boolState;
  }

  public int getIntState() {
    return intState;
  }
}

How would this be replaced by an Enumerated Annotation in Android?

Is it even suggestive to do something like that in this case? I searched everywhere, but I haven't found any answer for that.

Thank you in advance!

like image 290
thehayro Avatar asked Feb 28 '17 15:02

thehayro


1 Answers

I don't think you would be able to find anything because:

IntDef is a way of replacing an integer enum where there's a parameter that should only accept explicit int values.

you can read more about it here. Enumerated annotations are for simple types, you could use it for strings also StringDef. Use enum when you need its features. Don't avoid it strictly. For your case I think creating class instead of enum would look like this:

public class MyEnum {

    public static final MyEnum YES = new MyEnum(true, 1);
    public static final MyEnum NO = new MyEnum(false, 0);

    private boolean boolState;
    private int intState;

    MyEnum(boolean boolState, int intState) {
        this.boolState = boolState;
        this.intState = intState;
    }

    public boolean getBoolState() {
        return boolState;
    }

    public int getIntState() {
        return intState;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyEnum myEnum = (MyEnum) o;

        return boolState == myEnum.boolState && intState == myEnum.intState;
    }

}

and you could use constants in your code. But if using enums you will have type checking (you'll be able to accept only listed values) and method overloading (every enum constant can have its own implementation of a method). If you want to use less space and that is the only reason why you want to avoid using enum I would suggest you that it's not worth it.

like image 151
GROX13 Avatar answered Oct 20 '22 02:10

GROX13