Java中枚举类的创建及其应用场景

news/2024/5/18 22:37:21 标签: java, 开发语言, Enum, 枚举

枚举

枚举是一种特殊的类(编译之后也是生成class文件)可以实现接口,属于引用数据类型,枚举类是一组常量(枚举对象)的集合可以将枚举对象当作常量使用

自定义枚举

自定义一个类实现枚举的效果

  • 构造器私有化: 因为枚举对象的个数是固定的,所以需要防止直接new对象

  • 创建一组固定的枚举对象: 在类的内部直接创建枚举对象并使用常量接收,常量名通常全部大写并且使用final修饰(防止类加载)

  • 去掉属性的setXxx方法: 防止枚举对象的属性被修改

java">public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
    }
}
class Season {
    private String name;
    private String desc;
    // 定义了固定的四个季节对象
    public static final Season SPRING = new Season("春天", "温暖");
    public static final Season WINTER = new Season("冬天", "寒冷");
    public static final Season AUTUMN = new Season("秋天", "凉爽");
    public static final Season SUMMER = new Season("夏天", "炎热");
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum关键字

枚举类型的定义: 使用enum关键字替代class创建类, 此时创建的枚举类是final修饰的并且默认继承Enum即此时不能再继承其它类了

  • 枚举对象: 必须放在枚举类的行首,多个枚举对象使用逗号间隔,最后一个以分号结尾
  • 创建枚举对象的格式: 常量名(构造方法的实参列表),使用无参构造器创建枚举对象时实参列表和小括号都可以省略
java">enum 枚举类型名 implements 接口 1,接口 2{
    // 枚举对象
    枚举对象(构造方法的实参列表)....;
    // 枚举类也可以有属性和构造方法
}
java">public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season2.AUTUMN);
        System.out.println(Season2.SUMMER);
    }
}
// 枚举
enum  Season2 {
    // SPRING("春天", "温暖") 本质上还是public static final Season SPRING = new Season("春天", "温暖") 
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"),
    SUMMER("夏天", "炎热");
    // 属性
    private String name;
    private String desc;
    // 无参构造器
    private Season2() {

    }
    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

Enum_102">Enum类常用方法

方法名功能
toString()Enum类重写后的toString方法可以得到枚举对象的名称
我们自己也可以重写toString方法返回枚举对象的属性信息
name()返回枚举对象的名字
ordinal()返回该枚举对象在枚举类中的次序,从0开始编号
static values()以数组的形式返回枚举类中所有的枚举对象
static valueOf(枚举字符串)根据字符串获取枚举类中对应的枚举对象,如果枚举对象不存在则报异常
compareTo(枚举对象)比较两个枚举常量的编号,返回前面的减后面的差值

compareTo方法和toString方法源码分析

java">public final int compareTo(E o) {
	//...
    return self.ordinal - other.ordinal;
}

public String toString() {
    // 这个name是枚举对象的名称
    return name;
}
java">public class EnumMethod {
    public static void main(String[] args) {
        // 测试枚举对象的各种方法
        Season2 autumn = Season2.AUTUMN;

        // 测试name
        System.out.println(autumn.name());
        // 测试ordinal
        System.out.println(autumn.ordinal());
        // 测试values
        Season2[] values = Season2.values();
        System.out.println("===遍历取出枚举对象(增强for)====");
        for (Season2 season: values) {
            System.out.println(season);
        }

        // 测试valueOf,根据字符串"AUTUMN"查找Season2枚举类对应的枚举对象
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        System.out.println("autumn1=" + autumn1);
        System.out.println(autumn == autumn1);

        // 测试compareTo,比较两个枚举常量
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
}

枚举类的应用

方法的返回结果只有两种情况的时候使用布尔类型,只有当方法的结果超过两种情况并且每一种情况都是一枚一枚可以列举出来的时候推荐使用枚举

声明Week枚举枚举对象包含星期一至星期日的定义

java">public class EnumExercise02 {
    public static void main(String[] args) {
        // 获取到所有的枚举对象即数组
        Week[] weeks = Week.values();
        // 遍历
        System.out.println("===所有星期的信息如下===");
        for (Week week : weeks) {
            System.out.println(week);
        }
    }
}
enum Week   {
    // 定义Week的枚举对象
    MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"),
    FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
    private String name;

    private Week(String name) {
        this.name = name;
    }

    // 重写toString方法用来返回枚举对象的属性信息
    @Override
    public String toString() {
        // 这个name是枚举对象的属性信息
        return name;
    }
}

使用枚举类型来表示方法的多个返回结果,如果返回结果只有两种类型最好使用布尔类型(true和false正好可以表示两种不同的状态)

java">//自定义枚举类且没有属性
enum Result{
    SUCCESS, FAIL
}
public class EnumTest02 {
    public static void main(String[] args) {
        Result r = divide(10, 2);
        System.out.println(r == Result.SUCCESS ? "计算成功" : "计算失败");
    }

    // 计算两个int类型数据的商,返回结果是枚举类型
    public static Result divide(int a, int b){
        try {
            // 有可能发生java.lang.ArithmeticException
            int c = a / b;
            return Result.SUCCESS;
        } catch (Exception e){
            return Result.FAIL;
        }
    }
    
    // 使用布尔类型表示方法的返回结果
    public static boolean divide(int a, int b){
        try {
            int c = a / b;
            return true;
        } catch (Exception e){
            return false;
        }
    }
    
    //规定计算成功返回1,计算失败返回0
    public static int divide(int a, int b){
        try {
            int c = a / b;
            return 1;
        } catch (Exception e){
            return 0;
        }
    }
}

http://www.niftyadmin.cn/n/5224216.html

相关文章

Nodejs+Vue校园餐厅外卖订餐点餐系统 PHP高校食堂 微信小程序_0u4hl 多商家

对于校园订餐小程序将是又一个传统管理到智能化信息管理的改革,对于传统的校园订餐管理,所包括的信息内容比较多,对于用户想要对这些数据进行管理维护需要花费很大的时间信息,而且对于数据的存储比较麻烦,想要查找某一…

mysql中的锁及其作用

在MySQL中,锁是用于控制对数据库对象的并发访问的一种机制。锁可以防止多个事务同时对同一数据进行修改或删除,以确保数据的完整性和一致性。 MySQL中的锁有以下几种类型: 共享锁(Shared Lock):也称为读锁&…

leetcode:用队列实现栈(后进先出)

题目描述 题目链接:225. 用队列实现栈 - 力扣(LeetCode) 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点,而队列的特点是先进先出,那么我们可以用两个队列来实现 一个队…

Cesium 关闭深度写入

没有关闭PointPrimitive的深度写入: 关闭了PointPrimitive的深度写入: if (pointPrimitiveCollection._rsOpaque) {pointPrimitiveCollection._rsOpaque Cesium.RenderState.fromCache({depthTest: {enabled: false,}});}const p pointPrimitiveCollection.add({position:…

CVPR 2023 精选论文学习笔记:Towards Scalable Neural Representation for Diverse Videos

基于 MECE 原则,我们给出以下四个分类标准: 分类标准 1:表示类型 隐式神经表示(INR) 隐式神经表示(INR)是一类神经网络架构,将场景或对象表示为从 3D 点映射到颜色和不透明度值的连续函数。该函数通常从一组训练图像或视频中学习,然后可以用于渲染场景或对象的新视…

LeetCode Hot100 84.柱状图中最大的矩形

题目: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 方法: 代码: class Solution {public int largestRectang…

【前端】JS实现SQL格式化

sqlFormatter sql-formatter - npm (npmjs.com) const sqlFormatter require(/utils/sqlFormatter)let sql select count(1) as cnt from t_user where id < 7;// 格式化 // let sqlF sqlFormatter.format(sql);let sqlF sqlFormatter.format(sql, {language:mysql,})…

【古月居《ros入门21讲》学习笔记】16_tf坐标系广播与监听的编程实现

目录 说明&#xff1a; 1. 实现过程&#xff08;C&#xff09; 创建功能包&#xff08;C&#xff09; 创建tf广播器代码&#xff08;C&#xff09; 创建tf监听器代码&#xff08;C&#xff09; 配置tf监听器与广播器代码编译规则 编译并运行 编译 运行 2. 实现过程&a…