88

我有一个场景,其中我有Player 类型 ARCHERWARRIORsorcerer
我应该在 Player 类中为玩家类型使用什么?
常量最终静态字符串变量或枚举?为什么?
请帮忙说明原因。

4

5 回答 5

146

假设您使用常量字符串(或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 中的枚举可以有更多相关信息,也可以有行为。整体上好多了。

于 2012-07-20T08:13:29.480 回答
18

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

这可以帮助您在输入数据的同时不犯错误,输入域外的内容,还可以提高程序的可读性。

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

于 2012-07-20T08:13:38.717 回答
7

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

于 2012-07-20T08:30:31.233 回答
2

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

IntDef/StringDef 示例

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

于 2016-09-03T09:58:54.987 回答
-1

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

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

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

于 2012-07-20T08:27:05.007 回答