Java中的“枚举”有什么用?

所以我看着这个“枚举”types,它看起来像一个荣耀arrays / ArrayList / List给我。 究竟是什么使用它?

枚举作为一种固定数量的常量,至less可以用于两件事情

不变

 public enum Month { JANUARY, FEBRUARY, ... } 

这比创build一堆整型常量要好得多。

创build一个单身人士

 public enum Singleton { INSTANCE // init }; 

你可以用enums做一些有趣的事情,看看这里

另外看官方文档

如果类应该有一个固定的枚举实例数,则可以使用enum而不是class

例子:

  • DayOfWeek = 7个实例→ enum
  • CardSuit = 4个实例→ enum
  • Singleton = 1实例→ enum
  • Product =可变数量的实例→ class
  • User =可变数量的实例→ class
  • Date =可变数量的实例→ class

枚举types基本上是一种数据types,可以让您以更可读和更可靠的方式描述types的每个成员。

这是一个简单的例子来解释为什么:

假设你正在写一个与季节有关的方法:

int枚举模式

首先,你声明了一些int静态常量来表示每个季节。

 public static final int SPRING = 0; public static final int SUMMER = 1; public static final int FALL = 2; public static final int WINTER = 2; 

然后,你声明一个方法来打印季节的名字到控制台。

 public void printSeason(int seasonCode) { String name = ""; if (seasonCode == SPRING) { name = "Spring"; } else if (seasonCode == SUMMER) { name = "Summer"; } else if (seasonCode == FALL) { name = "Fall"; } else if (seasonCode == WINTER) { name = "Winter"; } System.out.println("It is " + name + " now!"); } 

那么之后,你可以打印一个这样的季节名称。

 printSeason(SPRING); printSeason(WINTER); 

对于一个class级中的不同types的成员来说,这是一种相当常见的(但是很糟糕的)方式。 但是,由于这些代码涉及到整数,所以你也可以调用这样的方法,没有任何问题。

 printSeason(0); printSeason(1); 

甚至像这样

 printSeason(x - y); printSeason(10000); 

编译器不会抱怨,因为这些方法调用是有效的,你的printSeason方法仍然可以工作。

但有些事情不对。 10000的季节代码是什么意思? 如果x - y结果是负数呢? 当你的方法收到一个没有意义的input时,你的程序一点也不知道。

您可以解决这个问题,例如,通过添加一个额外的检查。

 ... else if (seasonCode == WINTER) { name = "Winter"; } else { throw new IllegalArgumentException(); } System.out.println(name); 

现在,当季节代码无效时,程序将抛出一个RunTimeException 。 但是,您仍然需要决定如何处理exception。

顺便说一下,我相信你注意到FALLWINTER的代码都是2,对吗?

你现在应该明白了。 这种模式是脆弱的。 它使你在任何地方写条件检查。 如果你正在制作一款游戏,并且想要在你想象的世界中增加一个额外的季节,那么这种模式会让你走过按季节做事情的所有方法,在大多数情况下,你会忘记其中的一些。

你可能会认为类inheritance对于这种情况是一个好主意。 但是我们只需要其中的一部分而已。

这是enum进场的时候。


使用enumtypes

在Java中, enumtypes是通过公共静态final字段为每个枚举常量导出一个实例的类。

在这里你可以声明四个枚举常量: SPRING, SUMMER, FALL, WINTER 。 每个人都有自己的name

 public enum Season { SPRING("Spring"), SUMMER("Summer"), FALL("Fall"), WINTER("Winter"); private String name; Season(String name) { this.name = name; } public String getName() { return name; } } 

现在回到方法。

 public void printSeason(Season season) { System.out.println("It is " + season.getName() + " now!"); } 

而不是使用int ,现在可以使用Season作为input。 你可以告诉Season给你它的名字,而不是条件检查。

这是你现在如何使用这种方法:

 printSeason(Season.SPRING); printSeason(Season.WINTER); printSeason(Season.WHATEVER); <-- compile error 

当你使用一个不正确的input时,你会得到一个编译时的错误,并且只要程序编译,你就可以保证得到一个非空的单节引用。

当我们需要一个额外的季节,我们只是在Season增加另一个常数,没有更多。

 public enum Season { SPRING("Spring"), SUMMER("Summer"), FALL("Fall"), WINTER("Winter"), MYSEASON("My Season"); ... 

无论何时你需要一组固定的常量, enum可以是一个不错的select(但不总是)。 这是一个更可读,更可靠,更强大的解决scheme。

枚举types是一个types,它的字段由一组固定的常量组成。 常见的例子包括指南针的方向(北,南,东,西)和一周中的日子。

 public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } 

任何时候你需要使用枚举types来表示一组固定的常量。 这包括自然枚举types,例如太阳系中的行星,以及在编译时知道所有可能值的数据集,例如菜单上的选项,命令行标志等等。

这是一些代码,告诉你如何使用上面定义的date枚举:

 public class EnumTest { Day day; public EnumTest(Day day) { this.day = day; } public void tellItLikeItIs() { switch (day) { case MONDAY: System.out.println("Mondays are bad."); break; case FRIDAY: System.out.println("Fridays are better."); break; case SATURDAY: case SUNDAY: System.out.println("Weekends are best."); break; default: System.out.println("Midweek days are so-so."); break; } } public static void main(String[] args) { EnumTest firstDay = new EnumTest(Day.MONDAY); firstDay.tellItLikeItIs(); EnumTest thirdDay = new EnumTest(Day.WEDNESDAY); thirdDay.tellItLikeItIs(); EnumTest fifthDay = new EnumTest(Day.FRIDAY); fifthDay.tellItLikeItIs(); EnumTest sixthDay = new EnumTest(Day.SATURDAY); sixthDay.tellItLikeItIs(); EnumTest seventhDay = new EnumTest(Day.SUNDAY); seventhDay.tellItLikeItIs(); } } 

输出是:

星期一是坏的
周中的日子是如此。
星期五更好。
周末是最好的。
周末是最好的。

Java编程语言枚举types比其他语言中的对应语言更强大。 枚举声明定义了一个类(称为枚举types)。 枚举类的主体可以包含方法和其他字段。 编译器在创build枚举时会自动添加一些特殊的方法。 例如,他们有一个静态值方法,它返回一个数组,其中包含声明的所有枚举值。 此方法通常与for-each构造结合使用,以遍历枚举types的值。 例如,下面的Planet类例子中的代码遍历太阳系中的所有行星。

 for (Planet p : Planet.values()) { System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } 

除了它的属性和构造函数外,Planet还有方法可以让你检索每个星球上物体的表面重力和重量。 下面是一个示例程序,它可以将您的体重(在任何单位中)加以计算,并在所有行星上(在同一单元中)打印您的体重:

 public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.0268e7), URANUS (8.686e+25, 2.5559e7), NEPTUNE (1.024e+26, 2.4746e7); private final double mass; // in kilograms private final double radius; // in meters Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } private double mass() { return mass; } private double radius() { return radius; } // universal gravitational constant (m3 kg-1 s-2) public static final double G = 6.67300E-11; double surfaceGravity() { return G * mass / (radius * radius); } double surfaceWeight(double otherMass) { return otherMass * surfaceGravity(); } public static void main(String[] args) { if (args.length != 1) { System.err.println("Usage: java Planet <earth_weight>"); System.exit(-1); } double earthWeight = Double.parseDouble(args[0]); double mass = earthWeight/EARTH.surfaceGravity(); for (Planet p : Planet.values()) System.out.printf("Your weight on %s is %f%n", p, p.surfaceWeight(mass)); } } 

如果从命令行运行参数为175的Planet.class,则会得到以下输出:

$ java星球175
你在MERCURY上的体重是66.107583
你在VENUS上的体重是158.374842
你在地球上的体重是175.000000
你在MARS上的体重是66.279007
你在JUPITER上的体重是442.847567
你在SATURN的体重是186.552719
你在URANUS上的体重是158.397260
你在NEPTUNE上的重量是199.207413

来源: http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html

一个枚举是一个安全types,所以你不能在运行时分配一个新的值。 此外,你可以在switch语句中使用它(比如int)。

枚举是为定义的集合提供易于记忆的名称的推荐方法 (可选地也有一些有限的行为)。

你应该使用枚举,否则你会使用多个静态整数常量(例如, public static int ROLE_ADMIN = 0BLOOD_TYPE_AB = 2

使用枚举而不是这些的主要优点是types安全,尝试使用错误的值时编译types警告/错误,并提供相关“常量”的名称空间。 另外,它们在IDE中更容易使用,因为它也有助于代码完成。

Java编程语言的enums比其他语言中的对应语言要强大得多,而这些语言只是整体的荣耀。 新的枚举声明定义了一个完整的类(称为枚举types)。 除了解决在java 5.0之前使用的以下int Enum模式存在的所有问题( Not typesafe, No namespace, Brittleness and Printed values are uninformative )之外:

public static final int SEASON_WINTER = 0;

它也允许你添加任意的方法和字段到一个枚举types,实现任意接口,等等。 枚举types提供了所有Object方法的高质量实现。 它们是Comparable和可Serializable ,并且串行forms被devise为承受枚举types的任意改变。 您也可以在switch盒中使用Enum。

阅读Java Enums上的完整文章http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html了解更多详情。;

1)枚举是面向对象方法中的关键字。

2)它被用来编写单行代码,只是这不过是。

  public class NAME { public static final String THUNNE = ""; public static final String SHAATA = ""; public static final String THULLU = ""; } -------This can be replaced by-------- enum NAME{THUNNE, SHAATA, THULLU} 

3)大多数开发人员不使用枚举关键字,它只是一种替代方法..