为什么静态final int在android标准类中用于避免枚举?

时间:2016-08-24 22:20:30

标签: java android enums

在标准的android类static final int中,vars用于表示不同的标志。例如,查看可见性标志:

/** @hide */
@IntDef({VISIBLE, INVISIBLE, GONE})
@Retention(RetentionPolicy.SOURCE)
public @interface Visibility {}

/**
 * This view is visible.
 * Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
 * android:visibility}.
 */
public static final int VISIBLE = 0x00000000;

/**
 * This view is invisible, but it still takes up space for layout purposes.
 * Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
 * android:visibility}.
 */
public static final int INVISIBLE = 0x00000004;

/**
 * This view is invisible, and it doesn't take any space for layout
 * purposes. Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
 * android:visibility}.
 */
public static final int GONE = 0x00000008;

/**
 * Mask for use with setFlags indicating bits used for visibility.
 * {@hide}
 */
static final int VISIBILITY_MASK = 0x0000000C;

private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};

为什么开发人员在这种情况下避免使用enum

2 个答案:

答案 0 :(得分:0)

他们主要是为了表现,正如其他人所说的那样。主要的性能影响是他们使用的内存量。

我觉得这是关于此事的最佳资源(来自马口) https://youtu.be/Hzs6OBcvNQE

我知道视频在这里很不寻常,但它是关于这个问题的最重要的资源。

一个侧面点: 虽然Enums没有针对性能进行优化,但是如果他们使用Progaurd将编译时的所有枚举转换为静态最终整数,那么在Android Studio中完成的大多数应用都应该没问题。我这样做,因为我发现Enums更具表现力。

答案 1 :(得分:-2)

因为枚举很贵。首先,它们是弦乐。这意味着比较两个是字符串比较而不是int比较,这可能是成本的许多倍。其次,它们是对象。在具有有限RAM的设备上创建大量小对象是由于碎片导致OOM的一种很好的方式,每次分配都需要时间。因此,他们的表现太可怕了。

当他们设计枚举时,Java真的搞砸了 - 他们永远不应该是对象或字符串。即使是服务器端性能导向的代码,也可以避免它们支持整数。