我研究了一下这个“枚举”类型,感觉它有点像是一个夸大的数组/ArrayList
/List
。那么它到底有什么用处呢?
我研究了一下这个“枚举”类型,感觉它有点像是一个夸大的数组/ArrayList
/List
。那么它到底有什么用处呢?
Month
枚举只是一个普通类,除了Java确保该类仅被实例化12次。你说“至少可以用于两件事”,我认为这两件事是相同的。:-) 你同意吗? - aioobe如果一个类应该具有固定的枚举实例数量,您应该使用enum
而不是class
。
例如:
DayOfWeek
= 7个实例 → enum
CardSuit
= 4个实例 → enum
Singleton
= 1个实例 → enum
Product
= 可变数量的实例 → class
User
= 可变数量的实例 → class
Date
= 可变数量的实例 → class
枚举类型是一种数据类型,它让你以更可读和可靠的方式描述类型的每个成员。
这里有一个简单的例子来解释:
假设你正在编写一个与季节有关的方法:
首先,你声明了一些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);
这是一种相当常见(但糟糕)的方式,在类的不同成员类型中进行不同的处理。然而,由于这些代码涉及整数,因此您可以毫无问题地像这样调用该方法。
printSeason(0);
printSeason(1);
甚至可以像这样
printSeason(x - y);
printSeason(10000);
编译器不会抱怨这些方法调用是有效的,你的 printSeason
方法仍然可以工作。但是这里有些不对劲。10000
表示什么季节代码?如果 x-y
的结果为负数怎么办?当你的方法接收到一个没有意义且不应该存在的输入时,你的程序对此一无所知。你可以通过添加额外的检查来解决这个问题。...
else if (seasonCode == WINTER) {
name = "Winter";
}
else {
throw new IllegalArgumentException();
}
System.out.println(name);
现在当季节代码无效时,程序将抛出一个RunTimeException
。然而,您仍然需要决定如何处理异常。FALL
和WINTER
的代码都是2,对吗?enum
发挥作用的时候。enum
类型是通过公共静态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!");
}
你现在可以使用Season
作为输入,而不是使用int
。你可以告诉Season
返回它的名称,而不是进行条件检查。
现在使用此方法的方式如下:
printSeason(Season.SPRING);
printSeason(Season.WINTER);
printSeason(Season.WHATEVER); <-- compile error
只要程序编译通过,当您使用不正确的输入时,将会得到一个编译时错误,并且保证会获得一个非空的单例引用Season
。
当我们需要添加另一个季节时,只需在Season
中添加另一个常量即可,无需进行其他操作。
public enum Season {
SPRING("Spring"), SUMMER("Summer"), FALL("Fall"), WINTER("Winter"),
MYSEASON("My Season");
...
无论何时你需要一个固定的常量集合,enum
可能是一个很好的选择(但不总是)。它是一种更易读、更可靠和更强大的解决方案。枚举类型是一种类型,其字段由固定的常量集合组成。常见的例子包括罗盘方向(NORTH、SOUTH、EAST 和 WEST 值)和一周中的天。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
每当您需要表示一组固定的常量时,您应该使用枚举类型。这包括自然枚举类型,例如我们太阳系中的行星和数据集,在编译时您知道所有可能的值 - 例如菜单上的选项、命令行标志等。
下面是一些代码,展示了如何使用上面定义的Day枚举类型:
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编程语言枚举类型比其他语言中的枚举类型更加强大。 枚举声明定义了一个类(称为枚举类型)。 枚举类体可以包括方法和其他字段。 编译器在创建枚举时自动添加一些特殊方法。例如,它们具有静态值方法,该方法返回按声明顺序包含枚举所有值的数组。此方法通常与for-each结构结合使用,以便遍历枚举类型的值。例如,下面来自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,你会得到以下输出结果:
来源:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html$ java Planet 175
你在水星上的体重为66.107583
你在金星上的体重为158.374842
你在地球上的体重为175.000000
你在火星上的体重为66.279007
你在木星上的体重为442.847567
你在土星上的体重为186.552719
你在天王星上的体重为158.397260
你在海王星上的体重为199.207413
枚举类型是一种安全类型,因此无法在运行时分配新值。此外,您可以在 switch 语句中使用它(就像 int 类型一样)。
枚举类型是提供一组易于记忆的名称(可带有一些有限的行为)的推荐方式。
如果您需要使用多个静态整数常量(例如public static int ROLE_ADMIN = 0
或BLOOD_TYPE_AB = 2
),则应使用枚举。
相比之下,使用枚举的主要优势是类型安全性高,在尝试使用错误值时会产生编译器类型警告/错误,并提供相关“常量”的命名空间。此外,它们在IDE中更容易使用,因为它也可以帮助代码完成。
enums
比其他语言中的相应类型要强大得多,其他语言中的枚举类型不过是普通的整数。新的枚举声明定义了一个完整的类(称为枚举类型)。除了解决以前Java 5.0版本之前使用的int Enum模式存在的所有问题(不安全的类型、没有命名空间、脆弱性和打印值缺乏信息
),enums
还允许将任意方法和字段添加到枚举类型中,实现任意接口等。枚举类型提供了所有Object方法的高质量实现。它们是可比较的Comparable
和Serializable
,而序列化形式被设计为可以承受枚举类型中的任意更改。您还可以在switch
case中使用枚举类型。1) enum 是面向对象方法中的关键字。
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) 大多数开发者不使用枚举关键字,这只是一种替代方法。