一、简介
在现实生活中,经常存在一些比较固定和有限的值。比如季节(春、夏、秋、冬)、四大洋(太平洋、大西洋、印度洋、北冰洋)和五大洲(亚洲、欧洲、北美洲、南美洲、非洲、大洋洲、南极洲)等等。
在Java编程的过程中,虽然我们可以将其通过常量类来实现,但从JDK5后提供了枚举类型,使得代码更加优秀、清晰和优美。
二、初步认识
在枚举类型出现之前,Java如何实现枚举功能的呢?Java是通过在接口或类中定义public static final的变量来实现的。例如:
public class SeasonConstant {
public static final String SPRING="spring" ;
public static final String SUMMER="summer" ;
public static final String AUTUMN="autumn" ;
public static final String WINTER="winter" ;
}
而通过枚举类型的方式实现,例如:
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER
}
测试如下:
public class SeasonTest {
public static void main (String[] args) {
doSeason(Season.SPRING);
doSeason(Season.SUMMER);
doSeason(Season.AUTUMN);
doSeason(Season.WINTER);
doSeason("other" );
doSeason2(SeasonConstant.SPRING);
doSeason2(SeasonConstant.SUMMER);
doSeason2(SeasonConstant.AUTUMN);
doSeason2(SeasonConstant.WINTER);
doSeason2("other" );
}
private static void doSeason (Season season){
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 ;
}
}
private static void doSeason2 (String season){
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 ;
}
}
}
三、Enum类常用方法
![java.lang.Enum类常用的方法](https://img-blog.csdn.net/20151012105656478)
四、枚举类型的特点
1)关键字enum定义枚举类。默认继承了java.lang.Enum类(所有枚举类型的基类,继承了Object,
实现了Comparable和Serializable接口)而不是直接继承了Object类。
2)它不仅可以定义枚举值,它还可以定义构造函数(只能使用private访问修饰符,默认使用privat
e修饰),方法以及属性字段。
3)每个被枚举的成员实质是这个枚举类型的一个实例。枚举类的所有实例必须在枚举类中显式列出,
否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static
final修饰,无需程序员显式添加。
4)规范和约束运行时程序函数入参。
5)它其实是一个final类型的类,所以他不能被继承。
6)它允许有抽象函数。
五、枚举类型常见用法
1、常量
在枚举类型出现之前,Java通过常量接口或类来实现常量的定义:public static final 数据类型 变量名称=常量值。现在枚举类型可以将常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER
}
2、switch
在JDK1.6之前,switch语句只支持int、char和enum类型,使用枚举,能让我们的代码可读性更强。
public static void doSeason (Season season){
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 ;
}
}
3、向枚举中添加方法
枚举类型实质是一个类,那么枚举类型也可以定义方法、构造函数、Field等。
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER;
/**
* 定义方法,根据当前实例所在的索引返回相关的值
* @return
*/
public String getDesc (){
String desc="" ;
switch (this .ordinal()) {
case 0 :desc="春天" ;break ;
case 1 :desc="夏天" ;break ;
case 2 :desc="秋天" ;break ;
case 3 :desc="冬天" ;break ;
default : desc="不存在" ; break ;
}
return desc;
}
}
4、向枚举中添加构造函数
public enum Season {
SPRING("春天" ),SUMMER("夏天" ),AUTUMN("秋天" ),WINTER("冬天" );
private String seasonDesc;
private Season (String desc){
this .seasonDesc=desc;
}
public String getSeasonDesc (){
return seasonDesc;
}
}
public static void main (String[] args) {
for (Season season : Season.values()) {
System.out .println(season.getSeasonDesc());
}
}
5、实现接口的枚举类型
public interface IDesc {
public String getSeasonDesc ();
}
public enum Season implements IDesc{
SPRING("春天" ),SUMMER("夏天" ),AUTUMN("秋天" ),WINTER("冬天" );
private String seasonDesc;
private Season (String desc){
this .seasonDesc=desc;
}
@Override
public String getSeasonDesc () {
return seasonDesc;
}
}
public static void main (String[] args) {
for (Season season : Season.values()) {
System.out .println(season.getSeasonDesc());
}
}
6、每个枚举值实现接口
接口中的抽象方法由各个枚举值来实现。
public enum Season implements IDesc{
SPRING{
@Override
public String getSeasonDesc () {
return "春天" ;
}
},
SUMMER{
@Override
public String getSeasonDesc () {
return "夏天" ;
}
},
AUTUMN{
@Override
public String getSeasonDesc () {
return "秋天" ;
}
},
WINTER{
@Override
public String getSeasonDesc () {
return "冬天" ;
}
}
}
7、带有抽象方法的枚举类型
在枚举类型中声明抽象方法,由各个枚举值来实现。
public enum Season{
SPRING{
public String getSeasonDesc () {
return "春天" ;
}
},
SUMMER{
public String getSeasonDesc () {
return "夏天" ;
}
},
AUTUMN{
public String getSeasonDesc () {
return "秋天" ;
}
},
WINTER{
public String getSeasonDesc () {
return "冬天" ;
}
};
/**
* 抽象方法,每个枚举值都必须自己实现
* @return
*/
public abstract String getSeasonDesc ();
}
8、关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。