王剑编程网

分享专业编程知识与实战技巧

java枚举,我称之为全网最强教程(java枚举enum)

什么是枚举?

枚举是Java 5引入的一种特殊数据类型,用于定义一组固定的常量,在结构上和类很相似。枚举类型可以帮助我们组织和管理相关的常量,使得代码更加清晰、可读性更强。例如表示一周的天数、表示颜色、表示状态等等。


定义枚举


public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }


使用枚举

Day day = Day.MONDAY;

通过枚举名称直接引用相关的常量,有点像类的静态属性。

常用用法是配合switch使用

        Day day = Day.MONDAY;
        switch (day){
            case MONDAY:
                System.out.println("星期一");
                break;
            case TUESDAY:
                System.out.println("星期二");
                break;

        }


枚举比较

  Day day = Day.MONDAY;
  if(day == Day.MONDAY){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
   输出:
     true


枚举中定义的常量到底是啥?

枚举和类可以说非常相似,或者也可以称为具有特定限制的类。它的每一个常量都是一个对象(实例),都是一个事先创建好的对象。MONDAY是对象,TUESDAY也是对象,其余的都是对象。当使用Day.MONDAY时,实际上是引用MONDAY对象。

这也就是为什么枚举常量可以通过==来判断是否相等

      Day day = Day.MONDAY;
        Day day2 = Day.MONDAY;
        if(day == day2){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
   输出:
     true

因为day和day2引用的是同一个对象


构造方法

既然可以实例化对象,那么就应该有构造对象的构造方法,如果不定义构造方法,默认情况下,会使用默认的无参的构造方法:

private Day(){

   }
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    private Day(){
        System.out.println("实例化:"+this);
    }
}

注意SUNDAY后面要加";",而且构造方法必须是private,因为不允许我们自己创建对象。

当程序中没有用到该枚举时,不会为常量创建枚举对象,一旦用到就自动创建对象:

MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY

比如,如下程序:


public static void main(String[] args) {
        Day day = Day.MONDAY;
    }

当运行到Day.MONDAY时,会触发构造方法,为每一个枚举常量都创建对象,输出:

实例化:MONDAY
实例化:TUESDAY
实例化:WEDNESDAY
实例化:THURSDAY
实例化:FRIDAY
实例化:SATURDAY
实例化:SUNDAY


枚举属性

可以创建对象,理论上也可以让对象存在属性。比如给枚举加一个

description属性

public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    private Day(){
        System.out.println("实例化:"+this);
    }

    public String description = null;
}

修改MONDAY常量对象的属性:


Day.MONDAY.description = "星期一";
System.out.println(Day.MONDAY.description);
输出:星期一

此时,其他常量

(TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY)的description属性仍为null。


枚举方法

同样,也可以创建方法:

public void setDescription(String description){
        this.description = description;
    }


使用枚举方法:

修改MONDAY对象的description属性

Day.MONDAY.setDescription("星期一");


带参数的构造方法

由于有属性的存在,往往需要通过构造方法给属性赋值,那么就需要定义带参的构造方法:


private Day(String s){
        this.description = s;
    }

此时,枚举常量就可以通过构造方法给description属性赋值:

     MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期日");

从这里可以看出,枚举常量实际上相当于Day类的:

public static Day MONDAY = new Day("星期一");


重写方法

每一个枚举常量都可以重写枚举已经定义的方法:

MONDAY("星期一"){
        public void setDescription(String description){
            this.description = "今天是:" + description;
        }
    }


枚举遍历

可以使用values()方法遍历枚举中的所有常量:

for (Day day : Day.values()) {
    System.out.println(day);
}
输出:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY


valueOf方法

valueOf(String name):根据名称返回对应的枚举常量。

Day day = Day.valueOf("MONDAY");



我是程序员老左,欢迎关注和留言,后面会定期更新

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言