Java枚举类型

一、简介

   在现实生活中,经常存在一些比较固定和有限的值。比如季节(春、夏、秋、冬)、四大洋(太平洋、大西洋、印度洋、北冰洋)和五大洲(亚洲、欧洲、北美洲、南美洲、非洲、大洋洲、南极洲)等等。
   在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="";
        // ordinal()默认是从0开始的
        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 {
    /*
     *  注意:1)如果还有其他成员,枚举值必须定义在首行,而且最后需要分号“;”结束。
     *  2)各个枚举值后面(参数列表)时,枚举类型必须提供对应参数的构造函数,
     *  并且参数的对应关系是根据参数的所在序号对应起来的。
     *  当然如果提供了构造函数,各个枚举值必须也有对应的(参数列表)
     */
    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{
    /*
     *  注意:1)如果还有其他成员,枚举值必须定义在首行,而且最后需要分号“;”结束。
     *  2)各个枚举值后面(参数列表)时,枚举类型必须提供对应参数的构造函数,
     *  并且参数的对应关系是根据参数的所在序号对应起来的。
      *  当然如果提供了构造函数,各个枚举值必须也有对应的(参数列表)
     */
    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则可以是任意类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值