我有一个场景,其中我有玩家类型 ARCHER
,WARRIOR
和sorcerer
。
我应该在Player类中为玩家类型使用什么?
常量最终静态字符串变量或枚举?为什么?
请帮助解释原因。
答案 0 :(得分:112)
假设您使用常量字符串(或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...
VS
PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!
此外,Java中的枚举可以包含更多与之关联的信息,并且还可以具有行为。全面好多了。
答案 1 :(得分:12)
Enums将您限制为所需的输入集,而即使您使用常量字符串,您仍然可以使用其他字符串而不是逻辑的一部分。
这有助于您在输入数据时不会出错,输入域外的内容,还可以提高程序的可读性。
此外,如果您愿意,您可以随时将您的枚举用作字符串。这是reference。
答案 2 :(得分:5)
除了不让你提供不正确的值之外,枚举的另一个特征似乎很小,但在我看来非常重要。现代IDE可以自动建议枚举值,而无法可靠地推断字符串常量的可能值(Intellij IDEA执行后者,但仅适用于JDK类和流行库)。在您探索新API时,这尤其有用。
答案 3 :(得分:1)
Enum最适合用于类型安全。无法输入错误的值。但是android中的枚举占用了大量内存,你应该使用intdef代替。有关示例和说明,请参阅此答案: -
IntDef/StringDef Example
你也可以检查android源代码,它尽可能用IntDef / StringDef替换枚举。防爆。 View.VISIBLE。
答案 4 :(得分:0)
我建议您仅在真正需要枚举常量或所有项目通用的其他功能时才使用枚举。
这当然取决于您正在编写的应用程序类型以及您希望支持的版本和设备。
原因是,枚举增加了开销,因为它们分配了项目的实例。你可以注意到,android平台上有最小的枚举,几乎所有的常量都是最终的静态int(比如View.GONE和类似的东西)