Java面试题系列 - 第10天

server/2024/9/23 3:20:43/

题目:Java中的枚举类型(enum)及其高级应用

背景说明:Java中的枚举类型(enum)是一种特殊的类,用于定义一组固定的常量。枚举类型不仅限于提供常量集合,还可以实现接口、拥有方法和构造函数,甚至可以用作简单的数据结构。深入理解枚举类型及其高级应用,可以提升代码质量和开发效率。

问题要求

  1. 解释Java中枚举类型的基本概念和语法。
  2. 描述枚举类型相对于常规类的优点。
  3. 分析枚举类型如何实现接口和自定义方法。
  4. 提供一个枚举类型高级应用的示例。

答案批注

  1. 枚举类型的基本概念和语法:枚举类型在Java中用于定义一个固定数量的实例,这些实例称为枚举常量。枚举类型的基本语法如下:

     Java 

    浅色版本

    java">1public enum Color {
    2    RED, GREEN, BLUE;
    3}

    枚举常量默认是public、static和final的,枚举类型本身也默认是final的,防止继承。每个枚举常量都是枚举类型的实例,可以调用其方法和构造函数。

  2. 枚举类型相对于常规类的优点

    • 类型安全:枚举类型提供了类型安全的枚举常量集合,可以避免非法值的出现。
    • 内存效率:枚举类型的实例在内存中只会存在一份,避免了多次创建相同对象的开销。
    • 内置方法:枚举类型自带一些内置方法,如values()valueOf(),方便获取所有枚举常量或根据名称获取枚举常量。
    • 不可变性:枚举常量是不可变的,这使得它们非常适合用作常量。
  3. 枚举类型实现接口和自定义方法:枚举类型可以实现一个或多个接口,也可以定义自己的方法和构造函数。例如:

     Java 

    浅色版本

    java">1public enum Operation implements Function<Integer, Integer> {
    2    PLUS("+") {
    3        @Override
    4        public Integer apply(Integer x) {
    5            return x + x;
    6        }
    7    },
    8    MINUS("-") {
    9        @Override
    10        public Integer apply(Integer x) {
    11            return x - x;
    12        }
    13    };
    14
    15    private final String symbol;
    16
    17    Operation(String symbol) {
    18        this.symbol = symbol;
    19    }
    20
    21    public String getSymbol() {
    22        return symbol;
    23    }
    24}

    在这个例子中,Operation枚举实现了Function<Integer, Integer>接口,每个枚举常量都有一个apply方法的实现,以及一个构造函数和getSymbol方法。

  4. 枚举类型高级应用示例:使用枚举类型作为简单的状态机。

     Java 

    浅色版本

    java">1public enum OrderStatus {
    2    NEW("New") {
    3        @Override
    4        public OrderStatus nextStatus() {
    5            return PROCESSING;
    6        }
    7    },
    8    PROCESSING("Processing") {
    9        @Override
    10        public OrderStatus nextStatus() {
    11            return COMPLETED;
    12        }
    13    },
    14    COMPLETED("Completed") {
    15        @Override
    16        public OrderStatus nextStatus() {
    17            return this; // 已完成状态无法改变
    18        }
    19    };
    20
    21    private final String displayName;
    22
    23    OrderStatus(String displayName) {
    24        this.displayName = displayName;
    25    }
    26
    27    public String getDisplayName() {
    28        return displayName;
    29    }
    30
    31    public abstract OrderStatus nextStatus();
    32}

    在这个示例中,OrderStatus枚举定义了订单的不同状态,每个状态都有一个nextStatus方法,用于确定下一个可能的状态。这种方法可以清晰地定义和管理状态转换逻辑。

通过深入了解和灵活应用枚举类型,开发者可以编写出更安全、更高效、更具可读性的代码,特别是在需要定义固定集合或状态转换的场景中。

感谢你的点赞!关注!收藏!


http://www.ppmy.cn/server/59932.html

相关文章

昇思25天学习打卡营第19天|应用实践之基于MobileNetv2的垃圾分类

基本介绍 今天的应用实践是垃圾分类代码开发&#xff0c;整体流程是读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。采用的是MobileNetv2模型&#xff0c;使用官方提供的数据集&#xff0c;数据集分为4大类&…

设计模式:从HttpServletRequestWrapper了解装饰者模式

从一个参数处理的问题开始 为了满足安全测试&#xff0c;需要给系统追加防XSS注入的功能&#xff0c;关于此类安全的问题&#xff0c;一般的解决方案就是在请求到达Controller之前&#xff0c;使用Web框架的Filter或者Spring本身的拦截器对HttpServletRequest对象的参数进行处…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…

FastAPI 学习之路(四十八)WebSockets(四)接口测试

在我们测试的过程中&#xff0c;肯定会对接口进行测试。之前分享过的FastApi学习之路&#xff08;三十八&#xff09;对开发接口进行测试&#xff0c;那么我们针对websockets接口怎么测试呢。 其实也很简单 from fastapi.testclient import TestClient from main import appd…

【Docker系列】Docker 的基本概念和优势,以及在应用程序开发中的实际应用

Docker 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包到一个独立的容器中运行。Docker 的基本概念包括镜像、容器和仓库。 镜像是一个只读的文件&#xff0c;包含了运行应用程序所需的所有文件系统、库、环境变量等。容器是镜像的运行实例&#xff0c;它可以被启…

Redis在项目中的17种使用场景

Redis 是一个开源的高性能键值对数据库&#xff0c;它以其内存中数据存储、键过期策略、持久化、事务、丰富的数据类型支持以及原子操作等特性&#xff0c;在许多项目中扮演着关键角色。以下是V哥整理的17个Redis在项目中常见的使用场景&#xff1a; 缓存&#xff1a;Redis 可以…

在国内允许交易伦敦金吗?有没有好的伦敦金交易策略

伦敦金&#xff0c;作为全球金融市场上的一种重要投资品种&#xff0c;以其独特的交易机制和价值稳定性吸引了无数投资者的目光。然而&#xff0c;对于国内投资者而言&#xff0c;是否可以合法参与伦敦金的交易&#xff0c;以及如何制定有效的交易策略&#xff0c;是他们普遍关…

关于正点原子的alpha开发板的启动函数(汇编,自己的认识)

我傻逼了&#xff0c;这里的注释还是不要用&#xff1b; 全部换成 /* */ 这里就分为两块&#xff0c;一部分是复位中断部分&#xff0c;第二部分就是IRQ部分&#xff08;中断部分最重要&#xff09; 我就围绕着两部分来展开我的认识 首先声明全局 .global_start 在 ARM 架…