Java枚举类


1、什么是枚举类

实例(也叫对象)有限且固定不变的类,在Java里被称为枚举类。 枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或多个接口,也可以有自己的构造器。

个人理解:其实就是枚举类内部已经创建好我们已经确定的对象,私有构造器就是不允许修改和创建,用到枚举类说明这些对象就已经确定下来了。

例如,季节类,它只有4个实例(春、夏、秋、冬),并且这4个实例不会改变。可以用枚举类来表示:

public enum SeasonEnum{
    SPRING,SUMMER,FALL,WINTER;
}

1.1、枚举类的使用

  1. 枚举类的理解: 类的对象只有有限个,确定的,我们称此类为枚举类
  2. 当需要定义一组常量时,强烈建议使用枚举类
  3. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式
自定义枚举类

属性:private final
对象:private static final

注意事项:

  • a:构造器私有化。
  • b:本类内部,创建一组对象。
  • c:对外暴露对象。(通过 为对象添加 public static final 修饰符)
  • d:可以提供 get 方法,但是不提供 set 方法。防止修改。
package com.ly.business.test;
/**
 * 一、枚举类的使用
 * 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类
 * 2.当需要定义一组常量时,强烈建议使用枚举类
 * 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
 *
 * 二、如何定义枚举类
 * 方式一:jdk5.0之前,自定义枚举类
 * 方式二:jdk5.0,可以使用enum关键字定义枚举类
 *
 * 三、Enum类中的常用方法:
 *    values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
 *    valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
 *    toString():返回当前枚举类对象常量的名称
 *
 * 四、使用enum关键字定义的枚举类实现接口的情况
 *   情况一:实现接口,在enum类中实现抽象方法
 *   情况二:让枚举类的对象分别实现接口中的抽象方法
 *
 */
public class EnumDemo {
    public static void main(String[] args) {
        Season autumn = Season.AUTUMN;
        System.out.println(autumn);

    }
}


//自定义枚举类
class Season{
    //1、声明Season对象的属性:private final修饰
    private final String seasonName;
    private final String seasonDesc;
    //2、要私有化构造函数,并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
    //3、提供当前枚举类的多个对象:public static final的
    public static final Season SPRING=new Season("春天","春暖花开");
    public static final Season SUMMER=new Season("夏天","夏日炎炎");
    public static final Season AUTUMN=new Season("秋天","秋高气爽");
    public static final Season WINTER=new Season("冬天","冰天雪地");


    public String getSeasonName(){
        return seasonName;
    }

    public String getSeasonDesc(){
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}
使用关键字enum定义枚举类

JDK 1.5 之后,如何使用 关键字 Enum 关键字 定义枚举类:
-1.使用关键字 enum ,替代 class。
-2.public static final AA spring = new AA(“春天”, 10); –简化成-> spring(“春天”, 10);
-3.提供当前 枚举类的对象,多个对象之间用 “,” 隔开,末尾对象 “;” 结束
-4.如果使用 enum,要求将 定义的常量对象,(spring(“春天”, 10);)

public enum SeasonEnum {
    SPRING,SUMMER,AUTUMN,WINTER;
    private String name;
    private String desc;
    SeasonEnum(){}
    SeasonEnum(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public static void main(String[] args) {
        SeasonEnum spring = SeasonEnum.SPRING;
        System.out.println(spring);
    }
}

Color枚举类:

package com;
 
public enum Color { 
     RED, GREEN, BLANK, YELLOW 
}

Switch的使用

package com;
 
public class B {
    public static void main(String[] args) {
        showColor( Color.RED );
    }
    static void showColor(Color color){
        switch ( color ) {
        case BLANK:
            System.out.println( color );
            break;
        case RED :
            System.out.println( color );
            break;
        default:
            System.out.println( color );
            break;
        }
    }
}

1.2、实现接口的枚举类

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

1、实现接口,在enum类中实现抽象方法
package enumTest;

public interface DayInterface {
    public String getDay();
}
package enumTest;

public enum MyDay implements DayInterface{
    
    MONDAY(1,"星期一"),THUSDAY(2,"星期二");//这个后面必须有分号
    
    private int code;
    private String name;
    private MyDay(int code,String name) {
        this.code = code;
        this.name = name;
    }
    
    public int getCode() {
        return code;
    }
    public String getName() {
        return name;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.getName()+"---"+this.getCode();
    }

    @Override
    public String getDay() {
        return this.getName();
    }
}
package enumTest;

public class Test {
    public static void main(String[] args) {
        System.out.println(MyDay.THUSDAY.getDay());
    }
    //结果:星期二
}
2、让枚举类的对象分别实现接口中的抽象方法
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 summer=Season1.SUMMER;
        //toString():返回枚举类对象的名称
        System.out.println(summer.toString());
        //不重写tostring方法,返回对象名称:SUMMER
        System.out.println(Season1.class.getSuperclass());
        //class java.lang.Enum
        System.out.println("****************");
        //values():返回所有的枚举类对象构成的数组
        Season1[] values=Season1.values();
        for (int i = 0; i <values.length ; i++) {
            System.out.println(values[i]);
            values[i].show();
        }

        System.out.println("****************");
        //valueOf(String objName):返回枚举类中对象名是objName的对象。
        Season1 winter=Season1.valueOf("WINTER");
        //如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
        //Season1 winter=Season1.valueOf("WINTER1");
        System.out.println(winter);//WINTER
        winter.show();//这是冬天

    }
}
interface Info{
    void show();
}
enum Season1 implements Info{
    //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
    SPRING("春天","春暖花开"){
        @Override
        public void show() {
            System.out.println("这是春天");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("这是夏天");
        }
    },
    AUTUMN("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("这是秋天");
        }
    },
    WINTER("冬天","冰天雪地"){
        @Override
        public void show() {
            System.out.println("这是冬天");
        }
    };
    //2.声明Season对象的属性:private final修饰
    private final String seasonName;
    private final String seasonDesc;
    //3.私有化类的构造器,并给对象属性赋值
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //4.其他诉求1:获取枚举类对象的属性

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

总结:

1、枚举的本质是类,在没有枚举之前,仍然可以按照java最基本的编程手段来解决需要用到枚举的地方。枚举屏蔽了枚举值的类型信息,不像在用public static final定义变量必须指定类型。枚举是用来构建常量数据结构的模板,这个模板可扩展。枚举的使用增强了程序的健壮性,比如在引用一个不存在的枚举值的时候,编译器会报错。枚举的更多用法还需要在开发中去研究创造,Java5、Java6增加了不少新的特性,技术在升级,对程序员来说就要学习,如果你热爱java的话。否则别人用到新特性的代码你看不懂,那才叫郁闷。


文章作者: Liu Yuan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Liu Yuan !
—— 评论区 ——
  目录