在 android 中将参数化枚举转换为枚举注解

Convert parametized Enum to Enumerated Annotation in android

我有一个关于 andriod @IntDef 注释的问题。我知道 在它的基本用法中,它应该取代 enum。但是如果 我有一个带有多个硬连线值的参数化枚举,例如

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

如何将其替换为 Android 中的枚举注释?

在这种情况下,甚至暗示做这样的事情吗?我搜索了 无处不在,但我还没有找到任何答案。

提前致谢!

我认为您找不到任何东西,因为:

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

您可以阅读更多相关信息 here。枚举注释用于简单类型,您也可以将它用于字符串 StringDef。当你需要它的特性时使用枚举。不要严格避免它。对于您的情况,我认为创建 class 而不是枚举将如下所示:

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

}

并且您可以在代码中使用常量。但是,如果使用枚举,你将进行类型检查 (你将只能接受列出的值) 和方法重载 (每个枚举常量都可以有自己的实现方法)。如果你想使用 less space 并且这是你想避免使用枚举的唯一原因我建议你这是不值得的。

我在 Android 开发中遵循枚举规则:

  • 如果没有参数,使用 intdef/stringdef、
  • 如果它有参数,使用枚举

如果有使用枚举的方法,我肯定会考虑它不会破坏代码

Colt Mccanlis 发布的视频制作了很多内容:https://www.youtube.com/watch?v=Hzs6OBcvNQE&feature=youtu.be

然而,正如杰克·沃顿 (Jake Wharton) 指出的那样,其中有一些相当不稳定的数字:https://plus.google.com/+JakeWharton/posts/bTtjuFia5wm

枚举的主要缺点是它们比常量使用更多的内存,但如果该枚举有助于更好的代码,我会说使用它而不是微优化。只是不要过度使用它们并注意它们的足迹。

我来晚了,但无论如何,由于 intdef 插入了注释,您可以使用自定义 class 创建注释,然后以相同的方式使用它。鉴于注释需要基元这一事实,您必须将接口作为注释 class 类型传递,并使用 subclasses 作为值数组。

示例:

public interface GenericContainer<T, X> {
    public T getValueOne();
    public X getValueTwo();
}

然后 true/1

的实现
public class TrueContainer implements GenericContainer<Boolean, Integer> {
    @Override
    public Boolean getValueOne() {
        return true;
    }

    @Override
    public Integer getValueTwo() {
        return 1;
    }
}

和其他 false/0

public class FalseContainer implements GenericContainer<Boolean, Integer> {
    @Override
    public Boolean getValueOne() {
        return false;
    }

    @Override
    public Integer getValueTwo() {
        return 0;
    }
}

最后,使用它们:

    @Retention(RetentionPolicy.SOURCE)
    @GenericDef({TrueContainer.class, FalseContainer.class})
    public @interface genericTest{}
    boolean test = isTest(new FalseContainer());