JAVA基础 - 枚举类

news2024/9/20 5:22:42

目录

一. 简介

二. 声明 属性 方法

三. 常用方法

四. 使用技巧

五. 使用情景

六. 总结




一. 简介

在 Java 中,枚举类(Enum Class)是一种特殊的类,用于定义一组有限的、预定义的常量值。

枚举类的主要特点和优势包括:

  1. 类型安全:枚举类型提供了一种类型安全的方式来表示一组固定的值,避免了使用整数或字符串常量可能导致的错误。

  2. 可读性和可维护性:枚举值具有明确的名称,使得代码更具可读性和可理解性。当需要修改枚举值时,只需在枚举类中进行更改,而不必在整个代码中查找和替换常量。

  3. 相关方法:可以为枚举类定义方法,以提供与枚举值相关的特定功能。

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

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

在上述示例中,定义了一个表示一周中每天的枚举类 Day 。

可以在枚举类中添加方法,例如:

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

    public boolean isWeekday() {
        return this!= SATURDAY && this!= SUNDAY;
    }
}

在使用枚举类时,可以像这样进行操作:

Day today = Day.MONDAY;
if (today.isWeekday()) {
    System.out.println("It's a weekday");
}

总之,枚举类在 Java 中是一种非常有用的工具,用于处理有限的、固定的常量值集合,提高了代码的质量和可靠性。

二. 声明 属性 方法

在 Java 中,枚举类可以声明属性、方法和构造方法,以下是详细介绍:

声明属性

可以在枚举值中添加属性,为每个枚举值赋予特定的状态或数据。

public enum Season {
    SPRING("温和"), SUMMER("炎热"), AUTUMN("凉爽"), WINTER("寒冷");

    private String description;

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

    public String getDescription() {
        return description;
    }
}

方法

可以在枚举类中定义普通方法和抽象方法。

普通方法:

public enum Operation {
    ADD {
        @Override
        public int calculate(int num1, int num2) {
            return num1 + num2;
        }
    },
    SUBTRACT {
        @Override
        public int calculate(int num1, int num2) {
            return num1 - num2;
        }
    };

    public abstract int calculate(int num1, int num2);
}

构造方法

枚举类的构造方法只能是私有的,这样可以防止外部代码创建枚举值以外的实例。

public enum Color {
    RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);

    private int r;
    private int g;
    private int b;

    Color(int r, int g, int b) {
        this.r = r;
        this.g = g;
        this.b = b;
    }

    public int getR() {
        return r;
    }

    public int getG() {
        return g;
    }

    public int getB() {
        return b;
    }
}

通过为枚举类添加属性、方法和构造方法,可以使枚举类更加灵活和强大,能够满足更复杂的业务需求。

三. 常用方法

在 Java 中,枚举类型提供了一些常用的方法,以下是一些常见的:

  1. values() 方法:返回枚举类型的所有值组成的数组。

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

   public class EnumExample {
       public static void main(String[] args) {
           Day[] days = Day.values();
           for (Day day : days) {
               System.out.println(day);
           }
       }
   }
  1. valueOf(String name) 方法:根据给定的字符串名称返回对应的枚举值。如果输入的名称不存在对应的枚举值,会抛出 IllegalArgumentException 异常。

    示例:

   Day day = Day.valueOf("MONDAY");
  1. ordinal() 方法:返回枚举值在枚举声明中的位置索引(从 0 开始)。

   int index = Day.MONDAY.ordinal(); 

这些方法在处理枚举类型时非常有用,可以方便地操作和获取枚举值的相关信息。

四. 使用技巧

以下是一些 Java 枚举类的使用技巧:

  1. 利用枚举类实现单例模式
    通过将枚举值作为单例对象,可以简单而有效地实现单例模式,并且线程安全。
enum Singleton {
    INSTANCE;

    // 单例的相关方法和属性
    public void doSomething() {
        // 具体操作
    }
}
  1. 结合接口增强枚举功能
    可以让枚举类实现一个接口,为枚举值提供统一的方法定义。
interface Behaviour {
    void perform();
}

enum Action implements Behaviour {
    RUN {
        @Override
        public void perform() {
            System.out.println("Running");
        }
    },
    JUMP {
        @Override
        public void perform() {
            System.out.println("Jumping");
        }
    };
}
  1. 在枚举中使用 switch 语句
    根据不同的枚举值执行不同的逻辑。
enum Status {
    SUCCESS, FAILURE, PENDING;

    public void handle() {
        switch (this) {
            case SUCCESS:
                System.out.println("Operation succeeded");
                break;
            case FAILURE:
                System.out.println("Operation failed");
                break;
            case PENDING:
                System.out.println("Operation is pending");
                break;
        }
    }
}
  1. 为枚举值添加复杂的逻辑和数据
    可以在枚举值中包含更复杂的计算或数据处理逻辑。
enum Discount {
    FLAT_10(10) {
        @Override
        public double applyDiscount(double amount) {
            return amount - (amount * 0.1);
        }
    },
    FLAT_20(20) {
        @Override
        public double applyDiscount(double amount) {
            return amount - (amount * 0.2);
        }
    };

    private int percentage;

    Discount(int percentage) {
        this.percentage = percentage;
    }

    public abstract double applyDiscount(double amount);
}
  1. 枚举与注解结合
    可以使用枚举值作为注解的参数,增强注解的灵活性和可扩展性。
@Retention(RetentionPolicy.RUNTIME)
@interface Permission {
    Role role() default Role.USER;

    enum Role {
        ADMIN, USER
    }
}

@Permission(role = Role.ADMIN)
class AdminClass {
    // 类的定义
}

这些技巧可以帮助您更有效地利用 Java 枚举类,使代码更加简洁、清晰和易于维护。

五. 使用情景

  1. 表示有限的、固定的状态或选项

    • 例如,订单的状态(已下单、已支付、已发货、已完成、已取消)。
    • 文件的打开模式(只读、只写、读写)。
  2. 替代魔法数字或字符串常量

    • 避免在代码中直接使用不具名的数字或字符串来表示特定的含义,提高代码的可读性和可维护性。
  3. 定义一组相关的常量

    • 比如方向(东、南、西、北)、季节(春、夏、秋、冬)等。
  4. 配置选项

    • 当系统有一些可配置的选项,且这些选项是有限且明确的时候,使用枚举可以更清晰地表达这些选项。
  5. 表示类型安全的标志或标识

    • 例如,权限级别(管理员、普通用户)。
  6. 用于策略模式

    • 不同的枚举值可以对应不同的处理策略或算法。
  7. 数据库映射

    • 将枚举值与数据库中的特定值进行映射。
  8. 设计模式中的应用

    • 例如在状态模式中,状态可以用枚举来表示。

六. 总结

定义
使用 enum 关键字来定义枚举类。

enum EnumName {
    ENUM_VALUE1,
    ENUM_VALUE2,
    // 更多枚举值
}

特点

  1. 枚举类是一种特殊的类,不能被实例化,只能包含枚举值。
  2. 每个枚举值都是一个静态的、最终的实例。

属性
可以为枚举值添加属性来存储相关数据。

enum Season {
    SPRING("温和"), SUMMER("炎热"), AUTUMN("凉爽"), WINTER("寒冷");

    private String description;

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

    public String getDescription() {
        return description;
    }
}

方法

  1. 可以定义普通方法和抽象方法。
  2. 普通方法可以被所有枚举值共享和调用。
  3. 抽象方法需要每个枚举值提供具体的实现。

构造方法

  1. 构造方法必须是私有的,以防止外部创建枚举实例。
  2. 可以通过构造方法为枚举值初始化属性。

常用方法

  1. values():返回包含所有枚举值的数组。
  2. valueOf(String name):根据输入的字符串名称返回对应的枚举值,若不存在则抛出异常。
  3. ordinal():返回枚举值在定义中的索引位置(从 0 开始)。

用途

  1. 提供一种类型安全的方式来表示一组固定的常量值。
  2. 增强代码的可读性和可维护性。
  3. 可以在枚举值上附加相关的行为和数据。

总之,枚举类在 Java 中是一种强大且有用的工具,适用于需要定义一组有限的、预定义常量的场景,能够有效地提高代码的质量和可理解性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cyberchef基础概念之-循环语句操作-Jump/Label

在本专栏的前面的文章介绍了fork,merge,subsection,register等多种概念来解决实际场景的问题。本文将介绍的Jump/Label的操作类似于编程语言中的for和while的功能,相信在学会使用jump操作后,将有助于解决更为复杂的数据处理问题。 本文将详细的介绍该操…

Linux冯诺依曼体系、操作系统、进程概念、进程状态、进程切换

个人主页:仍有未知等待探索-CSDN博客 专题分栏:Linux 目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、为什么要有操作系统? 3、理解操作系统 1.管理的本质 2.管理的概念 3.操作系统结构图 4.为什么要有操作系统? 三…

【计算机网络】ICMP报文实验

一:实验目的 1:掌握ICMP报文的各种类型及其代码。 2:掌握ICMP报文的格式。 3:深入理解TTL的含义(Time to Live,生存时间)。 二:实验仪器设备及软件 硬件:RCMS-C服务器…

ocrbench:on the hidden mystery of ocr in large multimodel models

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准-CSDN博客文章浏览阅读1.9k次,点赞26次,收藏22次。本文主要介绍 OCRBench_ocrbenchhttps://blog.csdn.net/jiaoyangwm/article/details/138414709OpenCompass司南 - 评测榜单评测榜单旨在为大语言模型和多…

LINUX 孤儿进程和僵尸进程

1、孤儿进 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作 为了释放子进程的占用的系统资源: 进程结束之后&#xf…

CAPL通过回调函数applILTxPending模拟E2E失败

文章目录 问题解决办法之前的文章 CANoe CAPL通过回调函数applILTxPending实现E2E模拟发送 问题 问题:在使用CANoeIL仿真模拟E2E报文时,在一台电脑可以仿真成功,同样的工程复制到另外一台电脑就不行了,E2E不计算,这是因为什么? 两台机柜用的都是15版本,模拟失败的是从…

C++ //练习 15.30 编写你自己的Basket类,用它计算上一个练习中交易记录的总价格。

C Primer(第5版) 练习 15.30 练习 15.30 编写你自己的Basket类,用它计算上一个练习中交易记录的总价格。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块: /********************…

昇思25天学习打卡营第24天|基于MindSpore的红酒分类实验

相关知识 KNN k临近算法K nearest neighbor,用于分类和回归。主要思想为,训练一个样本和所有训练样本之间的举例,找到和这个样本最接近的k个样本,根据这k个样本的类别进行投票,票数最高的类就是分类的结果。模型效果…

全网最最实用--模型高效推理:量化基础

文章目录 一、量化基础--计算机中数的表示1. 原码(Sign-Magnitude)2. 反码(Ones Complement)3. 补码(Twos Complement)4. 浮点数(Floating Point)a.常用的浮点数标准--IEEE 754(FP32…

力扣 459重复的子字符串

思路: KMP算法的核心是求next数组 next数组代表的是当前字符串最大前后缀的长度 而求重复的子字符串就是求字符串的最大前缀与最大后缀之间的子字符串 如果这个子字符串是字符串长度的约数,则true /** lc appleetcode.cn id459 langcpp** [459] 重复…

LangChain 一 hello LLM

本来想先写LangChain系列的,但是最近被AutoGen、LlamaIndex给吸引了。2023就要过去了,TIOBE数据编程语言排名Python都第一了,可见今年AI开发之热。好吧,一边学习业界通用的LangChain框架,一边准备跨年吧。 前言 先是O…

基于FPGA的YOLOV5s神经网络硬件部署

一 YOLOV5s 本设计以YOLOV5s部署于FPGA上为例进行分析概述。YOLOV5s网络主要包括backbone、neck、head三部分。 涉及的关键算子: Conv:卷积,包括3*3、1*1,stride1/2Concat:Upsample:Pooling:ADD 二 评估 …

oncoPredict:根据细胞系筛选数据预测体内或癌症患者药物反应和生物标志物

在14年的时候,oncoPredict函数的开发团队在Genome Biology上发了一篇文章。 这篇文章的核心目的是阐释了使用治疗前基线肿瘤基因表达数据去预测患者化疗反应。开发团队发现使用细胞系去预测临床样本的药物反应是可行的。 鉴于之前的理论,该研究团队首先…

docker Docs相关使用文档链接

Docker Docshttps://docs.docker.com/ docker compose | Docker Docshttps://docs.docker.com/reference/cli/docker/compose/docker | Docker Docshttps://docs.docker.com/reference/cli/docker/

【计算机网络】静态路由实验

一:实验目的 1:掌握通过静态路由方法实现网络的连通性。 二:实验仪器设备及软件 硬件:RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。 软件:记事本、WireShark、Chrome浏览器等。 三:实验方…

linux集群架构--高可用--keepalived(13985字详解)

linux架构高可用 a.概述 高可用:HA HighAvailablity —>Keepalived生成VIP,DNS解析到这个IP地址即可 b.原理 keepalived 是基于VRRP协议实现高可用VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用,目前keepalive实现v…

企业公户验证API如何使用JAVA、Python、PHP语言进行应用

在纷繁复杂的金融与商业领域,确保每笔交易的安全与合规是至关重要的。而企业公户验证API,正是这样一位默默守护的数字卫士,它通过智能化的手段,简化了企业对公账户验证流程,让繁琐的审核变得快捷且可靠。 什么是企业公…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据,将每个单词表示为一个连续的向量,这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text,预测其文本标签label。以下使用mock商品数据的代码实现过程过下: 1、…

关闭Xshell后,任务将结束-tmux

Xshell标签中的会话结束后,会话中运行的进程也将被结束。 关闭标签 解释: xshell在断开连接后会中止所有正在运行的进程和任务,因为xshell客户端是通过ssh协议连接到远程服务器的,一旦连接断开,所有与该会话相关的进程…

数据结构 - 红黑树

文章目录 前言一、红黑树介绍1、红黑树的概念2、红黑树的性质 二、实现红黑树1、基本框架2、插入3、删除4、查找5、测试红黑树6、红黑树代码 三、红黑树性能四、AVL树和红黑树的差别 前言 红黑树是一种二叉搜索树,所以学习前需要学会基本的二叉搜索树,并…