枚举(enum
)是Java的一个关键字,它用于表示在Java中固定个数已知的值的特征,例如:一周的天数,太阳系中的行星数量等。枚举(枚举)是在Java JDK 1.5中引入的,它的自动装箱和拆箱,泛型,可变参数和静态导入的J2SE 5的功能。
现在我们在学习枚举存在之前,Java在特定的情况下如何枚举功能的:
文件:WeekDayConstants.java
package yiibai.tutorial.beforej5;
// 此类定义常量是一周中的几天。
public class WeekDayConstants {
public static final int MONDAY = 2;
public static final int TUESDAY = 3;
public static final int WEDNESDAY = 4;
public static final int THURSDAY = 5;
public static final int FRIDAY = 6;
public static final int SATURDAY = 7;
public static final int SUNDAY = 1;
}
用类的方法返回在一周中每一天具体要做的工作。
package com.yiibai.tutorial.beforej5;
public class Timetable {
// Returns name of Job will do
public static String getJob(int dayInWeek) {
if (dayInWeek == WeekDayConstants.SATURDAY
|| dayInWeek == WeekDayConstants.SUNDAY) {
return "休息或把妹";
}
return "编写代码";
}
}
- 没有类型安全:首先,它不是类型安全的; 可以指定任何有效的
int
值到dayInWeek
,如果dayInWeek
的值大于7
,就不知道是星期几了。 - 有意义的打印:打印这些常数的值,但不是打印一个有意义的名称,数值就是当打印
MONDAY
会打印出2
,而不是“星期一”
如果使用枚举(enum
),就很直观明了,如下Java 5中代码:
文件:WeekDay.java
package com.yiibai.tutorial.javaenum;
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
文件:Timetable.java
package com.yiibai.tutorial.javaenum;
public class Timetable {
public static String getJob(WeekDay weekDay) {
if (weekDay == WeekDay.SATURDAY || weekDay == WeekDay.SUNDAY) {
return "Nothing";
}
return "Coding";
}
}
1. 使用==操作符来比较枚举元素
枚举与类,接口的引用对象相似,它也可以使用==
操作符。下面来看看引用对象是如何比较的。
// 要比较引用对象,一般采用的方法 equals (..)
Object obj1 = .... ;
// 将对象与null进行比较,可以使用==运算符
if(obj1 == null) {
}
Object obj2 = ....;
// Not null
if (obj1 != null) {
// Comparing two objects.
if(obj1.equals(obj2)) {
}
}
使用枚举,可以使用==
操作符来比较。
文件:CompareEnumDemo.java
package com.yiibai.tutorial.javaenum;
public class CompareEnumDemo {
public static void main(String[] args) {
WeekDay today = WeekDay.SUNDAY;
// Use the == operator to compare two elements of Enum
if (today == WeekDay.SUNDAY) {
System.out.println("Today is Sunday");
}
}
}
2. 将枚举作为switch语句的参数
类似于基本数据类型 (int
, float
, ...
) 枚举可以用作在switch
语句的参数。
让我们来看一个例子,文件:SwitchDemo.java -
package com.yiibai.tutorial.javaenum;
public class SwitchDemo {
public static void main(String[] args) {
WeekDay day = WeekDay.THURSDAY;
switch (day) {
case MONDAY:
System.out.println("Working day");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Holiday");
break;
default:
System.out.println(day);
}
}
}
3. 获取枚举的元素
可以使用values ()
方法提取枚举的所有元素。如下面的例子:
package com.yiibai.tutorial.javaenum;
public class ValuesDemo {
public static void main(String[] args) {
// Get all the elements of the Enum.
WeekDay[] allDays = WeekDay.values();
for (WeekDay day : allDays) {
System.out.println("Day: " + day);
}
}
}
运行上面示例代码,得到以下结果 -
Day: MONDAY
Day: TUESDAY
Day: WEDNESDAY
Day: THURSDAY
Day: FRIDAY
Day: SATURDAY
Day: SUNDAY
4. 枚举构造函数和方法
枚举可以有构造函数和方法。仅构造初始化枚举内的对象,外部不能调用。参考以下示例代码:
文件:Gender.java
package com.yiibai.tutorial.javaenum;
public enum Gender {
// 从构造器初始化元素。
// 元素是 final, static
MALE("M", "Male"), FEMALE("F", "Female");
private String code;
private String text;
// Enum内部使用的构造函数构造函数的修饰符是 private
// 如果没有声明 private,java总是默认为 private。
private Gender(String code, String text) {
this.code = code;
this.text = text;
}
// Static method return Gender by code.
public static Gender getGenderByCode(String code) {
for (Gender gender : Gender.values()) {
if (gender.code.equals(code)) {
return gender;
}
}
return null;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
文件:GenderDemo.java
package com.yiibai.tutorial.javaenum;
public class GenderDemo {
public static void main(String[] args) {
Gender marryGender = Gender.FEMALE;
System.out.println("Code: " + marryGender.getCode());
System.out.println("Text: " + marryGender.getText());
// Gender[].
for (Gender gender : Gender.values()) {
System.out.println(gender.getText());
}
String code ="M";
Gender gender= Gender.getGenderByCode(code);
System.out.println("Gender by code: "+ gender);
}
}
执行上面示例代码,得到以下结果 -
Code: F
Text: Female
Male
Female
Gender by code: MALE
5. 覆盖枚举方法
可以重写继承自Object
类的 toString()
方法来覆盖枚举方法。
package com.yiibai.tutorial.javaenum;
public enum Currency {
VND, USD, EURO ;
@Override
public String toString() {
if (this == VND) {
return "Dong";
} else if (this == USD) {
return "Dola";
}
return super.toString();
}
public static void main(String[] args) {
Currency money = Currency.USD;
System.out.println("Money " + money);
System.out.println("Money " + money.toString());
System.out.println("VND " + Currency.VND);
System.out.println("EURO " + Currency.EURO);
}
}
执行上面示例代码,得到以下结果 -
Money Dola
Money Dola
VND Dong
EURO EURO
6.枚举的抽象方法
package com.yiibai.tutorial.javaenum;
public enum Color {
RED("red") {
@Override
public String getHexCode() {
return "#ff0000";
}
},
GREEN("green") {
@Override
public String getHexCode() {
return "#00ff00";
}
},
BLUE("blue") {
@Override
public String getHexCode() {
return "#0000ff";
}
};
private String name;
Color(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract String getHexCode();
}