12

在阅读了一些关于枚举的问题和答案后,我发现它并没有真正有用......

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

4

9 回答 9

36

您还可以做其他事情以及使用它们的原因,但我使用枚举的主要原因是防止出现无效参数的可能性。例如,想象以下方法:

public void doSomethingWithAMonth(int monthNum);

这不仅是模棱两可的(月份索引是从 1 开始还是从 0 开始?),而且您可以给出完全正确的无效数据(13+,负数)。如果您有MonthJAN、FEB 等的枚举,则签名变为:

public void doSomethignWithAMonth(Month month);

调用此方法的代码将更具可读性,并且不能提供无效数据。

于 2012-07-09T10:42:15.973 回答
10

我将 Enums 用于任何具有多个不变“类型”的事物。即一周中的几天。

为什么我在这种情况下不使用 String 是因为我不能在 String 上执行 switch 语句,而我可以在 Enum 上执行,所以一周中的每一天我都可以做一些特定的事情。

在使用单例模式时,我也使用 Enum,查看Effective Java book CH2(CHAPTER 2 CREATING AND DESTROYING OBJECTS),引用:

“虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。” 不会粘贴代码阅读这本书非常好。

如果我是你,我会首先阅读Java 中的思考一章枚举类型。然后在 Effective Java 第 6 章之后,你应该会很好

于 2012-07-09T10:42:48.860 回答
9

最简单的定义 -An enum is just like any other class, with a predefined set of instances.

enum 最好的部分是它可以在我们不能使用字符串的 switch 语句中使用。

并且 Enum 是一种安全类型,因此您不能在运行时分配新值。

于 2012-07-09T11:19:47.317 回答
4

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

于 2012-07-09T10:42:24.157 回答
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 枚举。这使代码更具可读性,并且不允许将两个天气整数相加。

于 2012-07-09T10:42:41.060 回答
3

我会在其他答案中添加枚举是只有固定数量实例的类。这些实例可能具有字段和方法,并且可以用作任何其他 Java 对象。例如,Month枚举可以定义方法,如

public int getNumberOfDays(int year);
public boolean isFirstOfYear();
于 2012-07-09T10:47:07.467 回答
2

正如“enum”这个名字一样,它是枚举常量的理想选择,它提供了扩展的功能。例如,您可以存储一些由多个参数组成的常量,例如:constantId、constanNameString、附加参数。此外,枚举可以包含函数。

枚举的一个奇特用途是制作单例。

于 2012-07-09T10:42:21.147 回答
2

当您拥有功能上重要且有限的值列表时,枚举很有用。

举例来说,您需要使用一周中的某一天:不会添加另一天,您宁愿在代码中使用 Day.MONDAY 而不是数字,并且必须记住 0 是星期一,1 是星期二和很快。它也使 switch 语句更容易理解,具有:

Switch(day) { 
  case Monday : ... break;
  case Tuesday : ... break
  etc.
}
于 2012-07-09T10:46:04.263 回答
2

除此之外,枚举对于创建单例很有用:

在 Java 中实现单例模式的有效方法是什么?

于 2012-07-09T10:46:53.707 回答