枚举类

枚举类

枚举类本质上是一个类,只不过这个类的对象是有限个的,不能让用户随便创建

枚举类的例子很多,比如说星期、月份、性别、订单状态、支付方式、线程状态等

开发中,如果针对于某个类,其实例是确定个数的,则推荐将此类声明为枚举类

如果枚举类的实例只有一个,则可以看作是单例的实现方式


枚举类方法
方法名说明
toString()在重写前,返回被调用的对象。可通过重写显示想要的内容
name()和没重写的toString()功能相同,返回当前对象的内容
values()返回枚举类型所有对象,通常用来遍历枚举类型用
valueOf(String objName)根据对象名找到该对象
ordinal()此方法非静态,用来查询此对象在枚举类生成次序

在实际开发中,枚举类型其实只需要这样写,代表着一个只有四个类型的构造类型

public enum Status {
    //在职,空闲,假期,离职;
    BUSY,FREE,VOCATION,DIMISSION;
}

枚举类实例
public class SeasonTest1 {
    public static void main(String[] args) {
        System.out.println(Season1.SPRING.name());//SPRING
        System.out.println(Season1.SUMMER);//Season1{seasonName='夏天', SeasonDesc='夏日炎炎'}
        Season1[] values = Season1.values();
        for (Season1 value : values) {
            System.out.println(value);
        }
        /*Season1{seasonName='春天', SeasonDesc='春暖花开'}
            Season1{seasonName='夏天', SeasonDesc='夏日炎炎'}
            Season1{seasonName='秋天', SeasonDesc='秋高气爽'}
            Season1{seasonName='冬天', SeasonDesc='白雪皑皑'}*/
        System.out.println(Season1.valueOf("AUTUMN"));//Season1{seasonName='秋天', SeasonDesc='秋高气爽'}
    }
}

enum Season1 {
    //本质上是public static final Season SPRING = new Season("春天", "春暖花开");
    //枚举类的声明的实例应该是静态常量,但在枚举类型类中,必须省略 public static final
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "白雪皑皑");
    //类中属性是不需要静态的,毕竟是多个在类中声明的对象 
    private final String seasonName;//季节的名称
    private final String SeasonDesc;//季节的描述
    //将构造方法私有化
    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        SeasonDesc = seasonDesc;
    }
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return SeasonDesc;
    }
    @Override
    public String toString() {
        return "Season1{" +
                "seasonName='" + seasonName + '\'' +
                ", SeasonDesc='" + SeasonDesc + '\'' +
                '}';
    }
}

枚举类实现接口操作
  • 枚举类实现接口,直接在枚举类中重写接口的抽象方法,使用不同的枚举类对象调用此方法时,执行的同一个方法
  • 枚举类实现接口,在枚举类的每一个实例中重写接口的抽象方法,使得不同的实例在调用该方法时执行不同的方法
枚举类实现接口实例
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

public class SeasonTest3 {
    public static void main(String[] args) {
        Season1.SPRING.show();//春天在哪里
        Season1.SUMMER.show();//宁静的夏天
        Season1.AUTUMN.show();//秋意浓
        Season1.WINTER.show();//大约在冬季
    }
}
interface Show{
    public void show();
}
enum Season1 implements Show{
    //本质上是public static final Season SPRING = new Season("春天", "春暖花开");
    //枚举类的声明的实例应该是静态常量,但在枚举类型类中,必须省略 public static final
    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("大约在冬季");
        }
    };
    private final String seasonName;//季节的名称
    private final String SeasonDesc;//季节的描述
    //将构造方法私有化(在enum中,构造方法一定是私有化的,不需要额外添加private参数)
    Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        SeasonDesc = seasonDesc;
    }
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return SeasonDesc;
    }
    @Override
    public String toString() {
        return "meijulei.Season1{" +
                "seasonName='" + seasonName + '\'' +
                ", SeasonDesc='" + SeasonDesc + '\'' +
                '}';
    }
}

在对象中可以直接重写类中方法