【问题标题】:Why use Enums instead of Constants? Which is better in terms of software design and readability为什么使用枚举而不是常量?在软件设计和可读性方面哪个更好
【发布时间】:2012-07-19 11:53:45
【问题描述】:

我有一个场景,其中有 玩家类型 ARCHERWARRIORsorcerer
我应该在 Player 类中为玩家类型使用什么?
常量 final static String 变量还是 Enum?为什么?
请帮忙说明原因。

【问题讨论】:

标签: java android enums


【解决方案1】:

枚举更适合用于类型安全。不能输入错误的值。但是 android 中的 enum 占用了这么多内存,你应该使用 intdef 来代替。示例和说明请参阅此答案:-

IntDef/StringDef Example

您还可以检查 Android 源代码,它正在尽可能用 IntDef/StringDef 替换枚举。前任。查看.可见。

【讨论】:

    【解决方案2】:

    除了不让你提供不正确的值之外,枚举的另一个特性可能看起来微不足道,但在我看来非常重要。现代 IDE 可以自动为枚举建议值,但无法可靠地推断字符串常量的可能值(Intellij IDEA 可以做到后者,但仅适用于 JDK 类和流行库)。这在您探索新 API 时特别有用。

    【讨论】:

      【解决方案3】:

      我建议您仅在确实需要枚举常量或所有项目通用的一些附加功能时才使用枚举。

      这当然取决于您正在编写的应用程序的类型以及您想要支持的版本和设备。

      原因是,枚举会增加开销,因为它们会分配其项目的实例。您可以注意到,android 平台中有最少的枚举,并且几乎所有常量都是最终的静态整数(如 View.GONE 之类的东西)

      【讨论】:

      • @Jon Skeet:你对此有何看法?
      • 有时类型安全值得付出“额外开销”的代价。
      【解决方案4】:

      枚举将您限制为所需的输入集,而即使您使用常量字符串,您仍然可以使用其他不属于您的逻辑的字符串。

      这可以帮助您在输入数据的同时避免出错,输入域外的内容,并提高程序的可读性。

      此外,如果您愿意,您可以随时将枚举用作字符串。这是reference

      【讨论】:

        【解决方案5】:

        假设您使用常量字符串(或 int 值 - 它们也是如此):

        // Constants for player types
        public static final String ARCHER = "Archer";
        public static final String WARRIOR = "Warrior";
        
        // Constants for genders
        public static final String MALE = "Male";
        public static final String FEMALE = "Female";
        

        那么你最终并不真正知道你的数据类型 - 导致可能不正确的代码:

        String playerType = Constants.MALE;
        

        如果你使用枚举,结果会是:

        // Compile-time error - incompatible types!
        PlayerType playerType = Gender.MALE;
        

        同样,枚举给出了一组受限的值:

        String playerType = "Fred"; // Hang on, that's not one we know about...
        

        PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!
        

        此外,Java 中的枚举可以有更多相关信息,也可以有行为。整体上好多了。

        【讨论】:

        • 枚举和常量的性能比较呢?
        • @waqas716:枚举是引用类型,但每个值只有一个对象,因此您不太可能浪费太多内存。如果您想要其他性能差异,则必须说出您感兴趣的内容。
        • 我必须把这个Player对象发送到一个webService,所以我会把这个对象转换成Json String,在这种情况下我应该使用String Constants还是Enum呢?
        • 您总是可以使用映射从枚举到字符串。 (Apache 的 Commons Collections 4 中还有一个双向映射,如果需要,您可以从字符串转到枚举:commons.apache.org/proper/commons-collections/apidocs/org/…
        猜你喜欢
        • 2011-10-22
        • 2013-02-09
        • 2016-05-19
        • 2013-02-05
        • 2013-06-12
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多