安卓开发:枚举类型 vs 静态 final 整型变量?

31

在Java Android应用程序中,拥有一个enum相对于一组static final int的优点(或缺点)是什么?是否存在有利于使用其中一种的效率或性能优化?

我在这个问题中问的是像意图请求代码等上下文 - 在Android示例代码中往往是int类型,而不是来自枚举的值,这与我在C中所习惯的不同。


枚举可以为空,整数不行。 - Erik
2
首先以最简洁的方式编写代码;如果您发现存在性能问题,并且确定不是IO问题,请考虑为了性能而重构代码。 - iluxa
4个回答

29

来自这个问题的枚举类型优点:

  • 相比于整数、字符串或布尔标志集,它们更加类型安全。
  • 它们导致代码更易于阅读。
  • 将枚举设置为无效值比将整数或字符串设置为无效值更加困难。
  • 它们使得发现变量或参数允许的值更加容易。
  • 我所阅读的文献均表明它们在C#和大多数JVM中的性能与整数相同。

我想补充一下:

  • 枚举可以有成员变量和实例变量,而int则不行。

像大多数抽象一样,在其性能追赶上后,它们通常是毫无疑问地有利的。尤其是在您的应用程序代码(而不是框架代码)中,我会选择枚举而不是模拟它们的其他方法。


谢谢你提供的关于 Android 文档的链接,我一段时间之前就读过它,一直对它很好奇。 - Ozzy

12

个人经验得出的非常简单的答案是,枚举类型提供了更好的类型安全性,或者说编译器在保持代码无错方面扮演了更积极的角色。

另一方面,由于枚举类型在对象世界中是“二等公民”,所以在一些更微妙的设计模式中,特别是涉及到泛型时,它们可能很难使用。

最后,你可以在位域中使用静态final整数。 不能通过枚举类型实现以下操作:

int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;

虽然我接受了第一个回答作为问题的正确答案,但我觉得你提出的最后一点实际上非常好。我自己从未尝试过,但这是一个非常好的事实需要知道。谢谢! - Cubic
6
在最后这部分,使用 EnumSet 是推荐的方式。我从来不太喜欢位标志模式。 - Spektr
类型安全是一个很重要的问题。通过运行静态分析工具,如Fake Enum Checker,您可以获得枚举类型的所有类型安全性好处,同时保留与现有代码的向后兼容性。如果您不关心与现有代码的向后兼容性,那么使用枚举通常更好。 - mernst

7

根据一个秃头的人的说法,枚举对内存来说真的很糟糕

你应该使用@IntDef/@StringDef注释:

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2; 

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
public @interface NavigationMode {}

然后

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

3

整数类型相对于枚举类型的一个优势在于类工厂。下面的 C# 代码不具有可扩展性:

class Factory
{
    public enum DrawableType {CIRCLE,SQUARE};
    public static Drawable GetInstance(DrawableEnum e)
    {
        if (e == DrawableType.CIRCLE)
        {
            return new Circle();
        }
        else if (e == DrawableType.SQUARE)
        {
            return new Square();
        }
        else
        {
            throw new IndexOutOfRangeException(); // should never get here
        }
    }

我写了这个糟糕的代码。在审查设计模式时,四人帮使用了int。我尝试在这里找回它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接