Java枚举

一、枚举的概念

枚举是一种特殊的数据类型,它在 Java 中被用来定义一组具名的常量。比如,你可以定义一个表示一周七天的枚举,里面的元素就是 “MONDAY”“TUESDAY” 等这样固定的常量值,它使得代码更加清晰、易于维护,并且限制了变量只能取预定义好的值,避免了随意赋值带来的混乱。可以把枚举认为是特别的类,但是这个类能实例化的对象是在类产生时就写好的。

二、定义枚举的基本语法

以下是一个简单的枚举定义示例:

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

花括号内列举出了这个枚举类型包含的所有枚举常量,它们之间用逗号隔开,最后一个常量后面可以跟一个分号(分号也可省略,不过如果枚举中有其他方法、构造函数等内容时,就需要加上分号)。

三、使用枚举

  • 作为方法参数传递
public class Test3 {
    public static void main(String[] args) {
        //声明一个变量
        Day d = Day.FRIDAY;
        printDay(d);
    }

    private static void printDay(Day d) {
        System.out.println("今天是"+d);
    }
}

运行结果:
在这里插入图片描述

  • switch 语句中使用
package test3;

public class Test4 {
    public static void main(String[] args) {
        Day d = Day.FRIDAY;

        whatDay(d);
    }

    private static void whatDay(Day d) {
        switch (d){
            case FRIDAY:
                System.out.println("周末到咯!~");
                break;
            case MONDAY:
                System.out.println("打工人的一周开始了");
                break;
            case SUNDAY:
            case SATURDAY:
                System.out.println("愉快的周末!");
                break;
            default:
                System.out.println("平常的一天");
                break;
        }
    }
}

switch 语句中,以枚举作为表达式,根据不同的枚举常量执行不同的代码逻辑,这样代码结构清晰且易读。

四、枚举的进阶特性

  • 添加方法和属性
    枚举可以有自己的方法和属性,示例如下:
public enum Day {
    MONDAY("忙碌的开始"),
    TUESDAY("继续加油"),
    WEDNESDAY("周中啦"),
    THURSDAY("快到周末了"),
    FRIDAY("期待周末"),
    SATURDAY("休息咯"),
    SUNDAY("放松的一天");

    private String description;

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

    public String getDescription() {
        return description;
    }
}

在这个 Day 枚举中,每个枚举常量都关联了一个描述信息。通过定义构造函数(构造函数默认是 private 的,不能被外部显式调用)为枚举常量初始化属性,并且定义了 getDescription 方法来获取该属性值。可以像这样使用:

Day today = Day.MONDAY;
System.out.println(today.getDescription());
  • 实现接口
    枚举可以实现接口,例如:
interface Wearable {
    void wear();
}


这里定义了 Workable 接口,Day 枚举实现了该接口,不同的枚举常量可以根据自身情况有不同的接口方法实现方式(对于 SATURDAYSUNDAY 这种休息的日子,就采用默认的 “今天休息,不用工作” 逻辑),然后可以这样调用:

Day today = Day.MONDAY;
today.doWork();

package Test4;

public enum Season implements Wearable {
    SPRING("春天来了"){
        @Override
        public void wear() {
            System.out.println("脱棉袄");
        }
    },
    SUMMER("最爱夏天"){
        @Override
        public void wear() {
            System.out.println("穿短袖了");
        }
    },
    AUTUMN("层林浸染啊"){
        @Override
        public void wear() {
            System.out.println("穿长袖");
        }
    },
    WINTER("北国风光,千里冰封"){
        @Override
        public void wear() {
            System.out.println("穿棉袄");
        }
    };


    private final String disc;
    Season(String disc) {
        this.disc = disc;
    }

    public void getDis(){
        System.out.println(this.disc);
    }

}

运行结果:
在这里插入图片描述

总之,Java 枚举是一种很实用的语言特性,在很多需要定义一组固定常量值的场景中能让代码更加规范、可读且便于维护。

五、Enum类的方法

Java 中的 Enum 类提供了一些很有用的方法,以下是对它们的详细介绍:

1. name () 方法

  • 方法说明:返回此枚举常量的名称,也就是在定义枚举时所写的那个常量的名字(字符串形式),且该名称与在代码中定义枚举常量时的标识符完全一致。
  • 示例代码
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY;
        System.out.println(day.name()); 
    }
}

在上述代码中,通过调用 day.name(),会输出 "MONDAY",因为这就是枚举常量 MONDAY 的名称。

2. ordinal () 方法

  • 方法说明: 返回此枚举常量的序数(它在枚举声明中的位置,从 0 开始计数)。也就是说,按照定义枚举常量的顺序,第一个常量的序数是 0,第二个是 1,依此类推。
  • 示例代码
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day monday = Day.MONDAY;
        Day tuesday = Day.TUESDAY;
        System.out.println(monday.ordinal()); // 输出 0
        System.out.println(tuesday.ordinal()); // 输出 1
    }
}

3. toString () 方法

  • 方法说明:默认情况下,它返回的就是调用 name() 方法得到的结果,也就是枚举常量的名称。不过,在实际应用中,如果对枚举类重写了 toString() 方法,那么就会按照重写后的逻辑返回相应字符串。
  • 示例代码(默认情况)
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY;
        System.out.println(day.toString()); // 输出 "MONDAY",和day.name()结果一样
    }
}
  • 重写 toString() 示例
public enum Day {
    MONDAY {
        @Override
        public String toString() {
            return "忙碌的周一";
        }
    },
    TUESDAY {
        @Override
        public String toString() {
            return "继续奋斗的周二";
        }
    },
    WEDNESDAY {
        @Override
        public String toString() {
            return "周中的周三";
        }
    }
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY;
        System.out.println(day.toString()); // 输出 "忙碌的周一",按重写后的逻辑输出
    }
}

4. valueOf () 方法(Enum 类的静态方法)

  • 方法说明:该方法用于返回指定枚举类型中具有指定名称的枚举常量。如果不存在具有该名称的枚举常量,将会抛出 IllegalArgumentException 异常。
  • 示例代码
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day day = Enum.valueOf(Day.class, "TUESDAY");
        System.out.println(day); // 输出 "TUESDAY"
    }
}

在上述代码中,通过指定 Day 枚举类型以及要查找的常量名称 "TUESDAY",就能获取到对应的 Day.TUESDAY 这个枚举常量。但如果写成 Enum.valueOf(Day.class, "FRIDAY")(假设 Day 枚举中原本没定义 FRIDAY 这个常量),就会抛出异常。

5. values () 方法

  • 方法说明:该方法返回一个包含该枚举类型所有枚举常量的数组,按照它们在枚举定义中的顺序排列。这个方法通常用于遍历枚举中的所有常量。
  • 示例代码
public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

public class EnumMethodExample {
    public static void main(String[] args) {
        Day[] days = Day.values();
        for (Day d : days) {
            System.out.println(d);
        }
    }
}

上述代码通过 Day.values() 获取到 Day 枚举所有常量组成的数组,然后利用循环遍历输出每个枚举常量,会依次输出 "MONDAY""TUESDAY""WEDNESDAY"

6. compareTo方法

用来比较两个枚举对象在声明时的次序

public enum Ha {
    FIRST,SECOND;

    public static void main(String[] args) {
        Ha h = FIRST;
        System.out.println(h.compareTo(SECOND));
    }
}

在这里插入图片描述
compareTo的内部逻辑是,前一个的值减去后一个,再次代码中就是FIRST-SECOND,结果为负数,表示FIRST比SECOND小,也就是FIRST在SECOND之前。

六、枚举类构造函数默认权限

枚举类的构造函数默认是 private 权限。这是因为枚举类型旨在表示一组固定的常量值,从设计角度来讲,不希望外部代码能够随意去创建新的枚举实例(除了定义好的那些枚举常量)。通过将构造函数默认设置为 private,就限制了只能在枚举类的内部使用这个构造函数来初始化那些预定义的枚举常量,保证了枚举的完整性和不可变特性。

你可能感兴趣的:(重生之JavaSE,java,开发语言)