1- Java枚举(Enum)是什么?
枚举(enum)是Java的一个关键字,它用于表示在Java中公知的值的固定个数的特征,例如一周的天数,太阳系中的行星数量等。枚举(枚举)是在Java JDK 1.5中引入的,它的自动装箱和拆箱,泛型,可变参数和静态导入的J2SE 5最喜欢的功能之一。
现在我们看来在枚举存在之前,Java在特定的情况下所做的:
- WeekDayConstants.java
package yiibai.tutorial.beforej5; // This class defines the constants are the days of the week. 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; }
用类的方法返回在一周中每一天具体要做的作业。 (时间表的那种)。
- Timetable.java
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 "Nothing"; } return "Coding"; } }
- 没有类型安全:首先,它不是类型安全的;您可以指定任何有效的int值到dayInWeek
- 任何有意义的打印:任何这些常数的值被打印,而不是打印一个有意义的名称,其数值就是当您打印MONDAY会打印出“2”,而不是“MONDAY”
见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"; } }
2- 可以使用==操作符来比较枚举元素
枚举就像类,接口的参考对象,但它也可以使用==操作
让我们看看参考对象是如何比较的。
// To compare the reference object, generally used method equals (..) Object obj1 = .... ; // Comparing object with null, can use the == operator 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"); } } }
3- 枚举在Java中可以用来作为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); } } }
4- 获取枚举的元素
我们可以提取枚举的所有元素,使用values ()方法。参见下面的例子:
- ValuesDemo.java
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
5- 枚举可以有构造函数和方法
枚举可以有构造函数和方法。仅构造初始化枚举内的对象,外部不能调用。我们看到一个例证:
- Gender.java
package com.yiibai.tutorial.javaenum; public enum Gender { // Initialize the elements from Constructor. // The element is always final, static MALE("M", "Male"), FEMALE("F", "Female"); private String code; private String text; // Constructor of Enum internal use only // Modifier of constructor is private // If you do not declare private, java alway understand is 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
6- 覆盖枚举方法
可以重写继承自Object类的 toString() 方法。
- Currency.java
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
7- 在枚举抽象方法
- Color.java
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(); }