【问题标题】:How to replace enum in Android?如何在 Android 中替换枚举?
【发布时间】:2020-05-23 02:20:38
【问题描述】:

我有一个这样的枚举:

public enum Type {
    VIDEO(10,"video"),
    AUDIO(11,"audio");

   int code;
   String desc;

   Type(int code,String desc){
       this.code = code;
       this.desc = desc;
   }
}

但是,在Android中不推荐使用枚举,用typedef怎么做,或者有其他更好的方法吗?

【问题讨论】:

    标签: android enums


    【解决方案1】:

    您可以使用@IntDef,但仍需要将code 转换为desc 的方法。但是看看谷歌开发者的文章,他说现在枚举不是什么大问题,不是内存开销,并且已经通过 R8 优化读取here

       @Retention(SOURCE)
       @IntDef({VIDEO,AUDIO})
       public @interface Type {}
       public static final int VIDEO = 10;
       public static final int AUDIO = 11;
    
       @Type int type
    

    【讨论】:

      【解决方案2】:

      在您的示例枚举中,您实际上并不需要desc 值,因为您可以使用name() 方法(甚至toString()),例如

      final String desc = Type.VIDEO.name();
      

      为方便起见,您可以将字符串结果转换为小写/大写。

      另一方面,@IntDef 是一种替换整数枚举的方法,其中有一个参数应该只接受显式 int 值。如果您有一个具有多个硬连线值的参数化枚举,例如您的 VIDEO(10,"video", "etc..."),您应该考虑使用该枚举。

      您还可以使用自定义类创建注释,然后以与此回复 Convert parametized Enum to Enumerated Annotation in android 中提到的相同方式使用它

      正如@Công Hải 所提到的,我还没有尝试过 R8,并评估了它在枚举上的性能。你会发现多篇关于枚举对你的应用程序有多糟糕的文章,而且它们看起来都非常正确。但不要严格避免。我会尽可能多地尝试使用@IntDef 或@StringDef,但这并不总是那么简单。我的建议,你应该分析你是否想为了避免枚举而失去代码可读性,或者为它们可能造成的开销而受苦。你可以随时尝试。

      【讨论】:

        【解决方案3】:

        由于 ART 将 Dalvik 替换为运行时环境,因此枚举不再是 Android 的问题。您可以在 2018 年的这段 Google IO 视频中找到有关它的更多信息:https://www.youtube.com/watch?v=IrMw7MEgADk&t=849s - 如果您不想观看整个视频,您可以快进到 14:09 分钟。

        另外,感谢 R8,大多数枚举也在编译时进行了优化:https://jakewharton.com/r8-optimization-enum-ordinals-and-names/

        所以请继续使用您的枚举 :) 与其他选项相比,它们使代码更简洁、更易于理解且不易出错。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多