一、枚举定义与初始化
在Java语言中,通过使用关键字enum来定义枚举。
enum Season{ SPRING,SUMMER,AUTUMN,WINTER; }
上述代码定义了一个Season的枚举类型,其中包含了四个常量(SPRING、SUMMER、AUTUMN、WINTER),它们都是Season类型的实例。枚举类型定义的格式为:enum 枚举类型名称 { 常量1,常量2,……常量n }
枚举在使用时可以直接通过枚举常量来进行初始化,例如:
public class EnumTest{ Season season; public EnumTest(Season season){ this.season = season; } public void describe(){ switch(season){ case SPRING: System.out.println("现在是春天!"); break; case SUMMER: System.out.println("现在是夏天!"); break; case AUTUMN: System.out.println("现在是秋天!"); break; case WINTER: System.out.println("现在是冬天!"); break; default: System.out.println("不知道现在是什么季节!"); break; } } public static void main(String[] args){ EnumTest test1 = new EnumTest(Season.SPRING); EnumTest test2 = new EnumTest(Season.SUMMER); EnumTest test3 = new EnumTest(Season.AUTUMN); EnumTest test4 = new EnumTest(Season.WINTER); test1.describe(); test2.describe(); test3.describe(); test4.describe(); } }
上述代码中,我们定义了一个名为Season的枚举类型,然后在EnumTest类中定义了一个用于描述季节的方法,这个方法的参数是一个Season类型的枚举常量。最后在main方法中我们通过分别传递不同的Season常量来对其进行测试,并打印出当前季节的描述。
二、使用枚举常量
在Java中,枚举常量也是枚举类型的实例。由于枚举常量可以看作是一种特殊的实例,因此可以像普通实例一样访问它们的成员变量和方法。
枚举常量还可以有自己的值,可以像下面这样对枚举常量进行赋值:
enum WeekDay{ MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"), THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日"); private String chineseName; WeekDay(String name){ chineseName = name; } public String getChineseName(){ return chineseName; } }
上述代码中定义了一个WeekDay枚举类型,每个枚举常量(MONDAY、TUESDAY、……SUNDAY)都有一个中文名称。每个枚举常量都可以通过getChineseName()方法来获取它的中文名称。
三、枚举和接口的使用
Java中的枚举类型可以实现接口,这让枚举在某些场景下变得更加灵活。例如:
interface Operation{ double apply(double x, double y); } enum BasicOperation implements Operation{ PLUS("+") { public double apply(double x, double y) { return x + y; } }, MINUS("-") { public double apply(double x, double y) { return x - y; } }, TIMES("*") { public double apply(double x, double y) { return x * y; } }, DIVIDE("/") { public double apply(double x, double y) { return x / y; } }; private final String symbol; BasicOperation(String symbol) { this.symbol = symbol; } @Override public String toString() { return symbol; } } public class UseEnum{ public static void main(String[] args){ double x = 10.0, y = 5.0; for(BasicOperation op : BasicOperation.values()){ System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y)); } } }
上述代码中,我们定义了一个Operation接口,这个接口包含了一个apply()方法,用于计算两个double类型参数的值。然后我们定义了一个BasicOperation枚举类型,其中每个枚举常量实现了Operation接口的apply()方法。最后在UseEnum类中,我们通过枚举的values()方法来遍历BasicOperation枚举类型中的所有枚举常量,分别对它们执行apply()方法,并输出运算结果。
四、枚举和泛型的使用
Java中的枚举类型也可以用于泛型类或泛型方法的定义中。例如:
public class EnumMapTest{ public static void main(String[] args){ EnumMapmap = new EnumMap<>(WeekDay.class); map.put(WeekDay.MONDAY, "星期一"); map.put(WeekDay.TUESDAY, "星期二"); map.put(WeekDay.WEDNESDAY, "星期三"); map.put(WeekDay.THURSDAY, "星期四"); map.put(WeekDay.FRIDAY, "星期五"); map.put(WeekDay.SATURDAY, "星期六"); map.put(WeekDay.SUNDAY, "星期日"); System.out.println(map); } }
上述代码中,我们定义了一个EnumMap类型的对象,并指定它的键值类型是WeekDay和String。接着我们向这个EnumMap对象中放入了7个键值对,最后用println()方法输出这个EnumMap对象。由于EnumMap的实现内部使用数组来存储键值对,因此EnumMap对键的判等比HashMap要快。
五、枚举对比和序列化
Java中的Enumeration接口虽然与枚举相关,但是它并不支持添加或删除元素等操作。而枚举类型则可以支持这些操作,因此在Java中建议使用枚举类型来代替Enumeration接口。
Java中的枚举类型默认是实现Serializable接口的,并且它们的序列化和反序列化都是在JVM中自动进行的。所以我们不用考虑用于序列化和反序列化的IO操作,这就大大节省了我们的时间和精力。
六、小结
本文对Java中枚举类型的定义、初始化、使用方法、接口和泛型等多个方面进行了详细的阐述,并给出了相应的代码示例。枚举类型在Java中是一种比较特殊的数据类型,需要熟练掌握这些使用方法才能更好地利用它们来完成编程任务。