我有一个场景,其中我有播放器类型ARCHER
、WARRIOR
和sorcerer
对于玩家类型,我应该在玩家类中使用什么
常量最终静态字符串变量还是枚举?为什么
请说明原因。
假设您使用常量字符串(或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中的枚举可以有更多与之相关的信息,也可以有行为。各方面都好多了。
枚举将您限制为所需的一组输入,而即使您使用常量字符串,您仍然可以使用不属于逻辑的其他字符串。
这有助于您在输入数据时不犯错误,输入域外的内容,并提高程序的可读性。
此外,如果您愿意,您可以随时将枚举用作字符串。这是一份参考资料。
除了不允许您提供错误的值之外,枚举还有另一个功能可能看起来很小,但在我看来非常重要。现代IDE可以自动建议枚举的值,而没有办法可靠地推断字符串常量的可能值(Intellij IDEA做了后者,但仅适用于JDK类和流行库)。当您正在探索一个新的API时,这尤其有帮助。
Enum最好用于类型安全。不能输入错误的值。但android中的enum占用了太多内存,所以应该使用intdef。请参阅此答案以获取示例和解释:-
IntDef/StringDef示例
你也可以检查android源代码,它正在尽可能用IntDef/StringDef替换枚举。示例视图.VISIBLE.
我建议您只有在真正需要枚举常量或所有项通用的一些附加功能时才使用枚举。
当然,这取决于你正在编写的应用程序类型以及你想要支持的版本和设备。
原因是,枚举会增加开销,因为它们会分配其项的实例。你可以注意到,在android平台中有最小的枚举,几乎所有的常量都是最终的静态int(比如View.GONE之类的)