枚举类快速入门(1)

302 阅读3分钟

源码分享: github.com/ddb12138/ju…

Enum枚举类

啥时候使用枚举类?

  • 定义一组常量时,强烈建议使用枚举类
  • 类的对象有确定个数
  • 类的对象不变
  • 方式一:jdk 5.0之前,自定义枚举类
  • 方式二:jkd 5.0时,可以使用enum关键字定义枚举类

自定义枚举类

三个要求

  • private final 来修饰的成员变量,符合使用枚举类的要求
  • 私有化构造器,确保对象个数确定
  • 通过public static final 修饰常量值,可以通过类.常量直接访问
//自定义注解类
public class CustomEnum {
    private final String seasonName;    //类的成员变量不变
    private final String seasonDesc;

    private CustomEnum(String seasonName,String seasonDesc){        //构造器私有化
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public static final CustomEnum SPRING = new CustomEnum("春天","春暖花开");        //static final值无法被修改
    public static final CustomEnum SUMMER = new CustomEnum("夏天","炎炎夏日");
    public static final CustomEnum AUTUMN = new CustomEnum("秋天","秋高气爽");
    public static final CustomEnum WINTER = new CustomEnum("冬天", "凛冬来袭");
    //可以重写toString方法或者添加get,set方法
    @Override
    public String toString() {  
        return "CustomEnum{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
    public static void main(String[] args) {
        System.out.println(CustomEnum.AUTUMN);
        //输出: CustomEnum{seasonName='秋天', seasonDesc='秋高气爽'}
    }
}

Enum关键字

看完自定义枚举类,看一下jkd 5.0添加的Enum类

package enumdemo;

//首先于上面自定义的class类很相似,只不过抽离了一些固定的前缀如public static final
enum Season {
    //public static final Seasons SPINRG = new Seasons("春天", "四季如春");
    //反正public static final 类名是固定的,还有new 类名也是固定的,不如去掉,然后多个值之间用逗号分开,结束用分号,其余不变
    SPRING("春天", "四季如春"),
    SUMMER("夏天", "热的不行"),
    AUTUMN("秋天", "凉风飒飒"),
    WINTER("冬天", "冰天雪地");

    private final String seasonName;
    private final String seasonDesc;


    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //可以添加其他诉求比如get方法、toString方法....

    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        // 输出  SPRING
    }
}

为什么输出SPRING?

System.out.println(Season.class.getSuperclass());
//输出 : class java.lang.Enum
//可以看出是使用了父类的toString方法,所以可以进行重写,下面是父类的一些信息

Enum类
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
    /**
     * The name of this enum constant, as declared in the enum declaration.
     * Most programmers should use the {@link #toString} method rather than
     * accessing this field.
     */
    private final String name;
   
	public String toString() {
        return name;
    }

常用方法

values获取所有对象 valueof获取指定对象 toString打印对象

public class enumtest {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);    //未重写toString
        System.out.println("***********");
        Season[] values = Season.values();  //values
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        System.out.println("***********");
        Season value = Season.valueOf("SPRING");		//如果不存在则会报Exception
        System.out.println(value);

        Season value1 = Season.valueOf("XXXX");		    
        System.out.println(value1);
    }
}

输出:
AUTUMN
***********
SPRING
SUMMER
AUTUMN
WINTER
***********
SPRING
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant enumdemo.Season.XXXX

与接口搭配使用

//接口,实现不同的enum对象有不同的实现方法
interface interfaceDemo {
    void sayHello();
}


//enum类
enum  SeasonNew implements interfaceDemo{
    SPRING("春天", "四季如春"),
    SUMMER("夏天", "热的不行");

    private final String seasonName;
    private final String seasonDesc;

    private SeasonNew(String name,String desc){
        this.seasonName=name;
        this.seasonDesc=desc;
    }

    @Override
    public void sayHello() {
        System.out.println("春天到了");
    }

    public static void main(String[] args) {
        SeasonNew.SPRING.sayHello();
        SeasonNew.SUMMER.sayHello();
    }
}

//输出:
//春天到了
//春天到了

修改版本

enum SeasonInterface implements interfaceDemo {
    SPRING("春天", "四季如春"){
        @Override
        public void sayHello() {
            System.out.println("春天到了");
        }
    },
    SUMMER("夏天", "热的不行"){
        @Override
        public void sayHello() {
            System.out.println("夏天到了");
        }
    };

    private final String seasonName;
    private final String seasonDesc;

    private SeasonInterface(String name,String desc){
        this.seasonName=name;
        this.seasonDesc=desc;
    }


    public static void main(String[] args) {
        SeasonInterface.SPRING.sayHello();
        SeasonInterface.SUMMER.sayHello();
    }
}

输出: 
春天到了
夏天到了