为什么Android使用Ints而不是Enums

mFe*_*ein 12 java int enums android

阅读关于Android,我可以看到使用这个框架的许多部分int常量返回值,或配置值(也喜欢在这里START_REDELIVER_INTENT),而不是一个enum,这是据我所知是可以找到的原因有很多更好的选择在网络上,像这样.

所以这让我想知道......为什么Google决定使用这么多int's而不是enum's

tyc*_*czj 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

编辑:

也是罗曼盖伊谈话之一的幻灯片

https://speakerdeck.com/romainguy/android-memories?slide=67

  • @ChrisStratton问题是为什么某些开发人员使用某种技术(这似乎是VTC作为基于意见的imo的理由).他发布了谷歌称谷歌这样做的原因.这听起来像是对我的绝对回答.我们应该相信你为什么他们做的比他们的文件更多? (5认同)
  • 换句话说,谷歌开发人员痴迷于过早优化.但我们知道; 它在整个API设计的理念中显而易见. (4认同)
  • @ChrisStratton问题:"为什么谷歌决定使用这么多的int而不是enum的".来自Google的文档:"枚举通常需要的内存是静态常量的两倍以上.您应该严格避免在Android上使用枚举." 告诉我更多关于它是如何切线的? (3认同)
  • "你应该严格避免在Android上使用枚举." 哇,这是非常糟糕的建议. (2认同)

Ser*_*kov 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.) 
Run Code Online (Sandbox Code Playgroud)

关于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;
Run Code Online (Sandbox Code Playgroud)

您也可以在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);
Run Code Online (Sandbox Code Playgroud)

所以理由是两个(至少):

  • 减少内存消耗.

  • 由于按位操作,工作速度更快.

  • `enum`关键字基本上是用于定义扩展`java.lang.Enum`的普通类的语法糖.枚举在permgen中具有与任何其他静态类相同的持久性.他们使用的内存多于int常量吗?他们当然会这样做.但我们谈的是几千字节.为了这种微优化,牺牲类型安全性,目的清晰度和可维护性被广泛认为是不好的做法. (4认同)
  • 这是一种荒谬的过于复杂的说法"因为两个整数常数的组合清晰" (3认同)
  • 内存消耗是不使用枚举的荒谬理由.与JVM加载的数百甚至数千个其他类相比,它们使用的内存量可以忽略不计.而且它们并不比任何其他阶级更具破坏性.如果操作系统需要内存,它将终止进程. (2认同)
  • 而你*可以*在枚举上有效地进行按位组合:http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html (2认同)