枚举类型有什么用途?

12

阅读了一些关于枚举的问题和答案后,我并没有觉得它特别有用...

它介于类和变量之间,但我不知道在哪里可以使用它使其比类或几个变量更有用。


6
何时在Java中使用枚举(Enum)或集合(Collection)?在需要限制变量可能取值的情况下,使用枚举。如果变量可以取多个值,则使用集合。枚举是一组具有事先定义的常量的有限集合。这些常量在整个程序中都是可用的。集合是一个对象容器,可以包含多个元素,每个元素可以重复出现或只出现一次。常见的集合类型包括List、Set和Map。 - Habib
1
https://dev59.com/TXI95IYBdhLWcg3w8y6N - assylias
9个回答

37

除了其他一些你可以做的事情和使用它们的原因外,我使用枚举类型的主要原因是为了防止无效参数的可能性。例如,想象一下以下方法:

public void doSomethingWithAMonth(int monthNum);

这不仅含糊不清(月份索引从1开始还是从0开始?),而且你可能会提供无效的数据(13+,负数)。如果你有一个枚举Month包含JAN,FEB等,则签名如下:

public void doSomethignWithAMonth(Month month);

调用这个方法的代码将更易读,并且不会提供无效的数据。


1
谢谢!现在我觉得我对它的理解更好了 :) - Roni Copul
1
那是一个简单而好的例子。 - njfife

10

我在任何有多种不变的“类型”需要使用枚举。例如,一周中的每一天。

为什么我不在这种情况下使用字符串是因为我无法在字符串上使用switch语句,但我可以在枚举上使用,所以对于每个星期几,我都可以执行特定的操作。

在使用单例模式时,我还会使用枚举,请参阅Effective Java书第2章(创建和销毁对象),引用:

"虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。"不打代码,请阅读这本优秀的书。

如果我是你,我会先阅读Thinking in java中的“枚举类型”章节。然后再阅读Effective Java的第6章,你应该就能掌握了。


9

最简单的定义 - 枚举就像任何其他类一样,具有预定义的实例集。

枚举最好的部分是它可以在switch语句中使用,而我们无法使用字符串。

并且枚举是一种安全类型,因此您无法在运行时分配新值。


2
只是为了任何遇到这个问题的人,从Java 7开始,不能在switch语句中使用String已经不再是真实的了。http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html - Vala

4

enum 强制程序员从预定义的实体或概念列表中进行选择。虽然您可以通过类或将变量设置为特定已知值来实现相同的目标,但枚举不容易出错,因为它公开并强制执行一个菜单,从中值的设置者可以选择。


4

枚举类型在防止人们做不该做的事情方面非常有用。例如,如果我有:

public final static int WEATHER_SUNNY = 0;
public final static int WEATHER_RAINY = 1;
public final static int WEATHER_HAIL = 2;

那么我可以这样做:MyClass.WEATHER_SUNNY + MyClass.WEATHER_HAIL 这种写法没有意义。这就是为什么最好使用一个 Weather 枚举。这使代码更易读,并且禁止将两个天气整数相加。


1
我不是这个例子的忠实粉丝,因为我觉得它鼓励了狭隘的思维方式。不同的天气类型之间没有理由不能重叠,事实上,它们经常会重叠。 - Vala
@Thor84no:感谢您的评论。然而,这完全取决于领域和应用程序,因此说“鼓励狭隘的思维”之类的话似乎不太合适。 - Simeon Visser

3

我想补充其他答案,枚举是仅有固定数量实例的类。这些实例可以具有字段和方法,并像任何其他Java对象一样使用。例如,Month 枚举可以定义如下方法:

public int getNumberOfDays(int year);
public boolean isFirstOfYear();

2

“enum”从名称上看,是用于枚举常量的理想选择,提供了扩展功能。例如,您可以存储由几个参数组成的一些常量,如:constantId,constanNameString,附加参数。此外,枚举可以包含函数。

使用枚举的一个奇特方式是制作单例。


2

枚举在你有一个有限的、功能上重要的值列表时非常有用。

例如,假设你需要使用一周中的某一天:不会添加其他的日期,你宁愿在代码中使用Day.MONDAY而不是一个数字,并且需要记住0是星期一,1是星期二等等。 这也使得switch语句更容易理解,例如:

Switch(day) { 
  case Monday : ... break;
  case Tuesday : ... break
  etc.
}

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接