3.枚举

一.模拟枚举

  1. 定义一个Week类,使用一个对象类型来表示固定的休息日的值,并私有化构造器,防止创建新的
    Week对象。

新建EnumDemo.java

//模拟枚举
class Week
{
    private Week(){
    }
    public static final Week MONDAy = new Week();
    public static final Week TUESDAY = new Week();
    public static final Week WEDESDAY = new Week();
    public static final Week THURDAY = new Week();
    public static final Week FRIDAY = new Week();
    public static final Week SATURDAY = new Week();
    public static final Week SUNDAY = new Week();
}
class Emplyoee
{
    private Week restday;
    Week getRestday(){
        return restday;
    }
    void setRestday(Week restday){
        this.restday = restday;
    }
}
class EnumDemo
{
    public static void main(String[] args)
    {
        Emplyoee e = new Emplyoee();
        e.setRestday(Week.MONDAy);
        Week restday = e.getRestday();
        if(restday == Week.SATURDAY || restday == Week.SUNDAY){
            System.out.println("在周末休息");
        }else{
            System.out.println("在周一到周五休息");
        }
    }
}

二.枚举的定义和特点

  1. 枚举是从Java5开始提供的一种新的数据类型,是一种特殊的类,就是固定的多个常量对象的集合。
定义格式:[修饰符] enum 枚举类名{
常量A,常量B,常量C;
}

image

  1. 枚举类的特点:
    1. 枚举的直接父类java.lang.Enum,但是不能显示继承Enum。
    2. 枚举就相当于一个类,可以定义构造方法,成员变量,普通方法和抽象方法。
    3. 默认私有的构造方法,即使不写访问权限也是private
    4. 每个实例分别用一个全局常量表示,枚举类的对象是固定的,实例个数有限,不能使用new关键字。
    5. 枚举实例必须位于枚举体中的最开始部分,枚举实例列表的后面要有分号,于其他成员向分隔。
    6. 枚举实例后有花括号时,该实例是枚举类的匿名内部类对象(查看编译后的class文件)

image

三. 枚举的使用

  1. 枚举中都是全局公共静态常量,可以直接使用枚举类名调用

    Weekday day = Weekday.SATURDAY;
    
  2. 因为java.lang.Enum类是所以枚举类的父类,所以所有的枚举对象都可以调用Enum类中的方法。

    String name = 枚举对象.name();//返回枚举对象的常量名称
    String str = 枚举对象.toString();//返回枚举对象的常量名称
    int ordinal = 枚举对象.ordina();//返回枚举对象的序号,从0开始
    
  3. 编译器生成的枚举类的静态方法:

    枚举类型[] values();
    Weekday[] wd = Weekday.values();返回当前枚举类型所有的常量,使用一个数组封装起来。
    枚举类型[] valueOf(String name);
    Weekday day = Weekday.valueOf("MONDAY");//把一个指定名称字符串转换为当前枚举类中同
    名的常量。
    

![image][use]

  1. 从Java5中开始出现枚举,switch也支持操纵枚举类型。
    switch只支持int类型,支持枚举是因为底层使用的枚举对象的ordinal,而ordinald的类型依然是int类型。

四.枚举的单例模式

建议使用枚举类做单例模式,很安全,即使使用反射也不能创建对象。

//枚举的单例模式
enum ArrayUtil
{
    INSTANCE;
    //排序操作
    public void sort(){
        System.out.println("排序算法");
    }
}
class EnumSingletonDemo
{
    public static void main(String[] args)
    {
        ArrayUtil.INSTANCE.sort();
    }
}
发布了58 篇原创文章 · 获赞 0 · 访问量 728

猜你喜欢

转载自blog.csdn.net/huang_kuh/article/details/104883197