阅读Android我可以使用int
常量查看框架的许多部分,以获取返回值或配置值(START_REDELIVER_INTENT
中的like in here),而不是{{1据我所知,这是一个更好的选择,因为很多原因可以在网络上找到like this。
所以这让我想知道......为什么Google决定使用这么多enum
代替int's
?
答案 0 :(得分:7)
直接从文档中删除
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
http://developer.android.com/training/articles/memory.html#Overhead
编辑:
也是罗曼盖伊谈话之一的幻灯片
答案 1 :(得分:6)
int上的操作比枚举上的操作快许多倍。
自己判断。每次创建枚举时,您都要创建一个最小值:
1) Class-loader for it.
2) You keep this object in memory.
3) Since enum is static anonymous class - it will always hang in your memory (sometimes even after you close the application.)
关于Service
。在此类中,标志主要用于比较并将结果返回到上面的类(ContextWrapper
)。但基本上,如果你深入了解 Android SDK的内容,你会发现自己几乎所有这些标志都被用于轮班操作。
即使在Java中也使用JDK中的二进制移位操作:
/**
* Max capacity for a HashMap. Must be a power of two >= MINIMUM_CAPACITY.
*/
private static final int MAXIMUM_CAPACITY = 1 << 30;
您也可以在Android SDK中查看Window类
/**
* Set the container for this window. If not set, the DecorWindow
* operates as a top-level window; otherwise, it negotiates with the
* container to display itself appropriately.
*
* @param container The desired containing Window.
*/
public void setContainer(Window container) {
mContainer = container;
if (container != null) {
// Embedded screens never have a title.
mFeatures |= 1<<FEATURE_NO_TITLE;
mLocalFeatures |= 1<<FEATURE_NO_TITLE;
container.mHasChildren = true;
}
}
/** The default features enabled */
@SuppressWarnings({"PointlessBitwiseExpression"})
protected static final int DEFAULT_FEATURES = (1 << FEATURE_OPTIONS_PANEL) |
(1 << FEATURE_CONTEXT_MENU);
减少内存消耗。
由于按位操作,工作速度更快。
答案 2 :(得分:0)
由于其他一些答案正确指出,这是因为枚举比int占用更多的内存。
要为该决定提供背景信息,您必须记住first Android device had 192mb of RAM。
如closest thing to an official statement from Google中所述,枚举不仅是int大小的2倍,而且当dex加载到RAM时,大小可能是int的13倍。因此,框架团队非常谨慎地在这方面过早地优化其代码。如果在开发Android时有4gb RAM的设备,也许情况会有所不同,但我们永远不会知道。
非框架开发的建议是对自己的用例进行判断。记住,Proguard通常会将您的枚举无论如何都转换为int,这毫不费力。