为什么Android不使用更多的枚举?
我开始非常喜欢在代码中使用C#和Java枚举,原因如下:
- 它们比整数,string或布尔标志组更安全得多。
- 他们导致更可读的代码。
- 将枚举设置为无效值比int或string更困难。
- 他们可以很容易地发现variables或参数的允许值。
- 我读过的所有东西都表明它们在C#和大多数JVM中的performance与整数一样好。
然而,Android框架有很多情况需要传递各种types的标志,但没有一个似乎使用枚举。 几个例子,我认为他们的使用将是有利的Toast.LENGTH_SHORT
/ Toast.LENGTH_LONG
和View.GONE
, View.VISIBLE
等
为什么是这样? 在Dalvik枚举执行比简单的整数值更糟? 有没有其他的缺点我不知道?
这个答案已经过时了2011年3月。
枚举可以在Froyo上使用 – 根据Android VM团队成员(和他的博客 )的回答( 为什么“避免Enum仅仅需要Ints的地方”从Android的性能提示中删除?
以前的答案:
官方的Android团队build议是避免枚举,只要你可以避免:
枚举非常方便,但不幸的是,当大小和速度很重要时可能会很痛苦。 例如,这个:
public enum Shrubbery { GROUND, CRAWLING, HANGING }
与具有三个公共静态final int的等效类相比,您的.dex文件增加了740个字节。 在第一次使用时,类初始化程序调用表示每个枚举值的对象的方法。 每个对象都有自己的静态字段,全集存储在一个数组(一个名为“$ VALUES”的静态字段)中。 这是很多代码和数据,只是三个整数。 另外,这个:
Shrubbery shrub = Shrubbery.GROUND;
导致静态字段查找。 如果“GROUND”是一个静态的final int,编译器会将其视为一个已知的常量并将其内联。
来源: 避免在只需要Ints的地方引入
整数更小,开销更less,这在移动设备上仍然很重要。
我的一个同事对这种情况进行了一个小testing。 他自动生成一个class
和enum
与“枚举”相同的数量。 我相信他生成了30000个条目。
结果是:
-
.class
的class
大概是1200KB - 。
enum
为大约800KB
希望这有助于某人。