枚举和android注释intDef

Ali*_*iSh 38 java enums android android-annotations android-support-library

我有一个枚举:

public enum AppEnums {
    SERVICE_ERROR,
    CONNECTION_ERROR;
}
Run Code Online (Sandbox Code Playgroud)

我想在Android Annotation的intDef中使用它:

@IntDef({AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}
Run Code Online (Sandbox Code Playgroud)

错误显示:

找到不兼容的类型,必填:'long'

我能用这种不相容的方法做些什么?

我不想手动处理AppEnum参数的值,Enum通常会自动创建值.AppEnums.CONNECTION_ERROR.ordinal()返回enum参数的int值,但这里不起作用.

Ole*_* K. 52

IntDef注释的主要思想是使用一组int常量,如a enum,但没有 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;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到详细的例子.

  • 那么intdef不适合你.intdef的要点是删除枚举的开销. (3认同)

Bha*_*gav 11

好吧,你不能那样做.AppEnums.SERVICE_ERROR永远不会回来int; 它会回来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 {
}
Run Code Online (Sandbox Code Playgroud)

复制自Yazazzello的评论如下:

IntDef - 适用于Android开发的新Enums.枚举通常需要的内存是静态常量的两倍多.你应该严格避免在Android上使用枚举.因此IntDef,如果设计用于替换枚举,则不能EnumIntDef声明中使用

  • "你应该严格避免在Android上使用枚举" - 很少有Java和Android专家同意该视频的演示者.见[Jake Wharton](https://twitter.com/JakeWharton/status/638447874515275776),[Bob Lee](https://twitter.com/crazybob/status/636959556539539457)和[Joshua Bloch](https:/例如/twitter.com/joshbloch/status/628663950389841920). (12认同)
  • IntDef - 适用于Android开发的新Enums.[枚举通常需要的内存是静态常量的两倍多.你应该严格避免在Android上使用枚举.](https://developer.android.com/training/articles/memory.html#Overhead)所以IntDef旨在取代枚举,你不能在IntDef声明中使用枚举 (4认同)
  • @Yazazzello标准Android"Hello,world"涉及数千个类和数万个对象.我保证使用枚举对性能没有明显的影响.如果您的应用程序将受益于增加的枚举类型安全性,请始终使用枚举. (3认同)