阅读了一些关于枚举的问题和答案后,我并没有觉得它特别有用...
它介于类和变量之间,但我不知道在哪里可以使用它使其比类或几个变量更有用。
阅读了一些关于枚举的问题和答案后,我并没有觉得它特别有用...
它介于类和变量之间,但我不知道在哪里可以使用它使其比类或几个变量更有用。
除了其他一些你可以做的事情和使用它们的原因外,我使用枚举类型的主要原因是为了防止无效参数的可能性。例如,想象一下以下方法:
public void doSomethingWithAMonth(int monthNum);
这不仅含糊不清(月份索引从1开始还是从0开始?),而且你可能会提供无效的数据(13+,负数)。如果你有一个枚举Month
包含JAN,FEB等,则签名如下:
public void doSomethignWithAMonth(Month month);
调用这个方法的代码将更易读,并且不会提供无效的数据。
我在任何有多种不变的“类型”需要使用枚举。例如,一周中的每一天。
为什么我不在这种情况下使用字符串是因为我无法在字符串上使用switch语句,但我可以在枚举上使用,所以对于每个星期几,我都可以执行特定的操作。
在使用单例模式时,我还会使用枚举,请参阅Effective Java书第2章(创建和销毁对象),引用:
"虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。"不打代码,请阅读这本优秀的书。
如果我是你,我会先阅读Thinking in java中的“枚举类型”章节。然后再阅读Effective Java的第6章,你应该就能掌握了。
最简单的定义 - 枚举就像任何其他类一样,具有预定义的实例集。
枚举最好的部分是它可以在switch语句中使用,而我们无法使用字符串。
并且枚举是一种安全类型,因此您无法在运行时分配新值。
switch
语句中使用String
已经不再是真实的了。http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html - Valaenum
强制程序员从预定义的实体或概念列表中进行选择。虽然您可以通过类或将变量设置为特定已知值来实现相同的目标,但枚举不容易出错,因为它公开并强制执行一个菜单,从中值的设置者可以选择。
枚举类型在防止人们做不该做的事情方面非常有用。例如,如果我有:
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 枚举。这使代码更易读,并且禁止将两个天气整数相加。
我想补充其他答案,枚举是仅有固定数量实例的类。这些实例可以具有字段和方法,并像任何其他Java对象一样使用。例如,Month
枚举可以定义如下方法:
public int getNumberOfDays(int year);
public boolean isFirstOfYear();
“enum”从名称上看,是用于枚举常量的理想选择,提供了扩展功能。例如,您可以存储由几个参数组成的一些常量,如:constantId,constanNameString,附加参数。此外,枚举可以包含函数。
使用枚举的一个奇特方式是制作单例。
枚举在你有一个有限的、功能上重要的值列表时非常有用。
例如,假设你需要使用一周中的某一天:不会添加其他的日期,你宁愿在代码中使用Day.MONDAY而不是一个数字,并且需要记住0是星期一,1是星期二等等。 这也使得switch语句更容易理解,例如:
Switch(day) {
case Monday : ... break;
case Tuesday : ... break
etc.
}