为什么使用枚举而不是常量?在软件设计和可读性方面哪个更好


77

我有,我有一个场景类型的玩家 ARCHERWARRIORsorcerer
对于播放器类型,我应该在Player类中使用什么?
常量最终静态String变量还是Enum?为什么?
请提供原因。


1
我不会使用String变量。如果有的话,是一个int变量(具有各种类型的漂亮常量)。
Thilo 2012年

6
这个答案对您有好处吗?stackoverflow.com/questions/613837/…–
吉米



1
@RBz这并没有改变Java中的枚举与C#和其他类似C的语言中的枚举完全不同的事实。即使标记为与语言无关,该问题的答案也都是C#特定的。
Mark Rotteveel

Answers:


135

假设您使用常量字符串(或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中的枚举可以具有与其相关的更多信息,并且还可以具有某些行为。全面好多了。


4
枚举和常量之间的性能比较如何?
Waqas

1
@ waqas716:枚举是引用类型,但是每个值只有一个对象,因此您不太可能浪费太多内存。如果你想其他的性能差异,你不得不说你感兴趣的东西。
乔恩斯基特

1
我必须将此Player对象发送到一个webService,因此我将把该对象转换为Json String,在这种情况下,我应该使用String Constants或Enum吗?
Waqas

您始终可以使用映射从Enums到Strings。(Apache的Commons Collections 4中还有一个双向地图,如果需要的话,它也允许您从Strings到Enums: commons.apache.org/proper/commons-collections/apidocs/org/…
Jacob Holloway

13

枚举将您限制为所需的一组输入,而即使您使用常量字符串,您仍然可以使用其他String(不是逻辑的一部分)。

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

另外,如果需要,您始终可以将枚举用作字符串。这是参考


6

除了不允许您提供不正确的值之外,枚举的另一个功能可能看起来很小,但我认为这很重要。现代IDE可以自动为枚举建议值,而无法可靠地推断出字符串常量的可能值(Intellij IDEA会这样做,但只能用于JDK类和流行的库)。在探索新的API时,这特别有用。



0

我建议您仅在确实需要枚举常量或所有项目共有的某些其他功能时才使用枚举。

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

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


2
@Jon Skeet:你怎么说?
Waqas 2012年

1
有时类型安全值得“增加的开销”的代价。
Michael Campbell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.