枚举和 android 注释 intDef

Enums and android annotation intDef

我有一个枚举:

public enum AppEnums {
    SERVICE_ERROR,
    CONNECTION_ERROR;
}

并且我想在 Android 的 intDef 中使用它注释:

@IntDef({AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}

错误显示:

incompatible types found, required: 'long'

我能用这种不兼容性做什么?

我不想手动处理 AppEnum 参数的值,Enum 通常会自动创建值。 AppEnums.CONNECTION_ERROR.ordinal() return 枚举参数的 int 值但不适用于此处。

嗯,你不能那样做。 AppEnums.SERVICE_ERROR 永远不会 return int;它将 return AppEnums.SERVICE_ERROR。这就是枚举类型的意义所在。

我可以建议的是:

public static class AppEnums {
    public static final int CONNECTION_ERROR = 0;
    public static final int SERVICE_ERROR = 1;
}

@IntDef({AppEnums.CONNECTION_ERROR,AppEnums.SERVICE_ERROR})
    public @interface ServiceErrors {
}

从下面 Yazazzello 的评论中复制:

IntDef - new Enums for Android development. Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android. so IntDef where designed to replace Enums, you cannot use Enum in IntDef declarations

IntDef 注释的主要思想是像 enum 一样使用一组 int 常量,但是 没有 enum.在这种情况下,您必须手动声明所有常量。

@IntDef({Status.IDLE, Status.PROCESSING, Status.DONE, Status.CANCELLED})
@Retention(RetentionPolicy.SOURCE)
@interface Status {
    int IDLE = 0;
    int PROCESSING = 1;
    int DONE = 2;
    int CANCELLED = 3;
}

你可以看到详细的例子here

@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_STARTED, PENDING, COMPLETED})
public @interface DownloadState {
    int NOT_STARTED = 1;
    int PENDING = 2;
    int COMPLETED = 3;
}

带注释的整数类型元素,表示逻辑类型,其值应该是显式命名的常量之一。

注意:如果 IntDef#flag() 属性设置为 true,则可以组合多个常量。

@IntDef(flag = false,value = {AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
@Retention(RetentionPolicy.SOURCE)
public @interface AppEnums {

  int CONNECTION_ERROR = 0;
  int SERVICE_ERROR = 1;
}

注意:如果 IntDef#flag() 属性设置为 true,则可以组合多个常量。

您还可以对长值使用 @LongDef,对 StringValues

使用 @StringDef