Android为什么不使用更多枚举?


79

由于某些原因,我开始非常喜欢在代码中使用C#和Java枚举:

  • 它们比整数,字符串或布尔标志集更具类型安全性。
  • 它们导致更具可读性的代码。
  • 将枚举设置为无效值比使用int或字符串更困难。
  • 它们使发现变量或参数的允许值变得容易。
  • 我读过的所有内容都表明它们在C#和大多数JVM中的表现与整数一样好。

但是,Android框架有很多情况需要传递各种类型的标志,但是似乎没有一个使用枚举。在那里我会认为他们的使用将是有益的一对夫妇的例子是Toast.LENGTH_SHORT/Toast.LENGTH_LONGView.GONEView.VISIBLE等等。

为什么是这样?枚举在Dalvik中的表现是否比简单整数差?还有其他我不知道的缺点吗?



1
大!我喜欢枚举,但还没走出来就把它们取出来。
我们都是莫妮卡

Answers:


66

截至2011年3月,此答案已过期。

可以在Froyo或更高版本上使用枚举-根据此答案(为什么从Android的性能提示中删除了“避免枚举您只需要整数的地方?”),请从Android VM团队的成员(及其博客)中获取。


上一个答案:

Android小组的官方建议是尽可能避免枚举:

枚举非常方便,但是不幸的是,当大小和速度很重要时,枚举会很痛苦。例如,这:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

与具有三个public static final int的等效类相比,向您的.dex文件添加了740个字节。首次使用时,类初始化器在代表每个枚举值的对象上调用该方法。每个对象都有其自己的静态字段,并且整个集合存储在数组中(称为“ $ VALUES”的静态字段)。仅三个整数就包含大量代码和数据。此外,这:

Shrubbery shrub = Shrubbery.GROUND;

导致静态字段查找。如果“ GROUND”是静态的final int,则编译器会将其视为已知常量并将其内联。

资料来源:避免只需要整数的枚举


4
因此,尽管C#枚举表现非常好,Java的枚举不要因为他们更复杂。因此,我的最后要点不是真的。正确?
我们都是莫妮卡

25
这可能不再有效,请参见stackoverflow.com/questions/5143256/…–
维克多·达尔

2
Android文档仍然建议不要使用枚举:“枚举通常需要比静态常量多两倍的内存。您应严格避免在Android上使用枚举。” developer.android.com/training/articles/memory.html#Overhead
ThomasW,2015年

1
@SebastianPaaskeTørholm您提供的链接(this:developer.android.com/guide/practices/design/…)不再显示提示。
Android开发人员

14

整数更小,所需的开销也更少,这在移动设备上仍然很重要。


另外,我们现在为Android Studio和Lint提供了很好的工具。我的意思是注释IntDefStringDef,它们允许声明某种typedef,因此使用int常量非常方便。blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

是的,但是Retrofit模型又如何呢?(以及我假定的其他网络库)您如何定义状态响应(例如,成功,失败,token_expired)以直接映射到POJO?
mitsest

5

我的一位同事针对这种情况进行了一次小测试。他自动生成了具有相同数量“枚举”的“ a” class和“ an enum”。我相信他产生了30000个条目。

结果是:

  • .class对于class粗略1200KB
  • .class因为enum大约是800KB

希望这对某人有帮助。


我认为这不是有效的测试。一个地方有30000个枚举/静态字段是不现实的情况。您需要比较大量小类/枚举的大小,例如1000个类/枚举,每个属性30个。我敢打赌,总大小会大不相同。
Iwo Banas 2012年

7
@Iwo Banas任何测试都是有效的测试。没说它将回答这个问题。只是将其作为额外信息提供给可能感兴趣的任何人。向下投票似乎是当之无愧的,谢谢。-_-
prolink007,2012年

难道不是相反吗?那个枚举用得更少?是1200KB还是800KB的内存或存储空间?
Android开发人员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.