读书笔记-《ON JAVA 中文版》-摘要25[第二十二章 枚举]
文章目录
- 第二十二章 枚举
- 1. 基本功能
- 1.1 基本 enum 特性
- 2. 方法添加
- 2.1 方法添加
- 2.2 覆盖 enum 的方法
- 3 switch 语句中的 enum
- 4. values 方法的神秘之处
- 5. 实现而非继承
- 6. 随机选择
- 7. 使用接口组织枚举
- 8. 使用 EnumSet 替代 Flags
- 9. 使用 EnumMap
- 10. 常量特定方法
- 11. 本章小结
第二十二章 枚举
关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。这是一种非常有用的功能
1. 基本功能
1.1 基本 enum 特性
package enums;enum Shrubbery {GROUND, CRAWLING, HANGING}public class EnumClass {public static void main(String[] args) {for (Shrubbery s : Shrubbery.values()) { // 实例 .values() 方法返回 enum 实例的数组System.out.println(s + " ordinal: " +s.ordinal()); // ordinal() 方法返回 enum 实例在声明时的次序,从 0 开始System.out.print(s.compareTo(Shrubbery.CRAWLING) + " ");System.out.print(s.equals(Shrubbery.CRAWLING) + " ");System.out.println(s == Shrubbery.CRAWLING);System.out.println(s.getDeclaringClass()); // 其所属的 enum 类System.out.println(s.name()); // 获取值System.out.println("********************");}for (String s :"HANGING CRAWLING GROUND AA".split(" ")) {// valueOf() 是在 Enum 中定义的 static 方法,// 它根据给定的名字返回相应的 enum 实例,// 如果不存在给定名字的实例,将会抛出异常Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);System.out.println(shrub);}}
}
输出:
GROUND ordinal: 0
-1 false false
class enums.Shrubbery
GROUND
********************
CRAWLING ordinal: 1
0 true true
class enums.Shrubbery
CRAWLING
********************
HANGING ordinal: 2
1 false false
class enums.Shrubbery
HANGING
********************
HANGING
CRAWLING
GROUND
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant enums.Shrubbery.AAat java.lang.Enum.valueOf(Enum.java:238)at enums.EnumClass.main(EnumClass.java:32)
2. 方法添加
2.1 方法添加
除了不能继承自一个 enum 之外,基本上可以将 enum 看作一个常规的类。也就是说可以向 enum 中添加方法。enum 甚至可以有 main() 方法。
一般来说,我们希望每个枚举实例能够返回对自身的描述,而不仅仅只是默认的 toString() 实现,这只能返回枚举实例的名字。为此,你可以提供一个构造器,专门负责处理这个额外的信息,然后添加一个方法,返回这个描述信息。
package enums;public enum OzWitch {WEST("Miss Gulch, aka the Wicked Witch of the West"),NORTH("Glinda, the Good Witch of the North"),EAST("Wicked Witch of the East, wearer of the Ruby " +"Slippers, crushed by Dorothy's house"),SOUTH("Good by inference, but missing");private String description;OzWitch(String description) {this.description = description;}public String getDescription() {return description;}public static void main(String[] args) {for (OzWitch witch : OzWitch.values()) {System.out.println(witch + witch.getDescription());}}
}
输出:
WESTMiss Gulch, aka the Wicked Witch of the West
NORTHGlinda, the Good Witch of the North
EASTWicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house
SOUTHGood by inference, but missing
2.2 覆盖 enum 的方法
package enums;import java.util.stream.Stream;public enum SpaceShip {SCOUT, CARGO, TRANSPORT,CRUISER, BATTLESHIP, MOTHERSHIP;@Overridepublic String toString() {String id = name();String lower = id.substring(1).toLowerCase();return id.charAt(0) + lower;}public static void main(String[] args) {Stream.of(values()).forEach(System.out::println);}
}
输出:
Scout
Cargo
Transport
Cruiser
Battleship
Mothership
3 switch 语句中的 enum
在 switch 中使用 enum,是 enum 提供的一项非常便利的功能。一般来说,在 switch 中只能使用整数值,而枚举实例天生就具备整数值的次序,并且可以通过 ordinal() 方法取得其次序(显然编译器帮我们做了类似的工作)。
package enums;enum Signal {GREEN, YELLOW, RED,}public class TrafficLight {Signal color = Signal.RED;public void change() {switch (color) {case RED:color = Signal.GREEN;break;case GREEN:color = Signal.YELLOW;break;case YELLOW:color = Signal.RED;break;}}@Overridepublic String toString() {return "The traffic light is " + color;}public static void main(String[] args) {TrafficLight t = new TrafficLight();for (int i = 0; i < 5; i++) {System.out.println(t);t.change();}}
}
输出:
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
The traffic light is GREEN
4. values 方法的神秘之处
前面已经提到,编译器为你创建的 enum 类都继承自 Enum 类。然而,如果你研究一下 Enum 类就会发现,它并没有 values() 方法。答案是,values() 是由编译器添加的 static 方法。
5. 实现而非继承
所有的 enum 都继承自 Java.lang.Enum 类。由于 Java 不支持多重继承,所以你的 enum 不能再继承其他类:
enum NotPossible extends Pet { ... // Won't work
然而,在我们创建一个新的 enum 时,可以同时实现一个或多个接口。
6. 随机选择
package onjava;import java.util.Random;public class Enums {private static Random rand = new Random(47);public static <T extends Enum<T>> T random(Class<T> ec) {return random(ec.getEnumConstants());}public static <T> T random(T[] values) {return values[rand.nextInt(values.length)];}
}
package enums;import onjava.Enums;enum Activity {SITTING, LYING, STANDING, HOPPING,RUNNING, DODGING, JUMPING, FALLING, FLYING
}public class RandomTest {public static void main(String[] args) {for (int i = 0; i < 20; i++) {Activity random = Enums.random(Activity.class);System.out.print(random + " ");}}
}
输出:
STANDING FLYING RUNNING STANDING RUNNING STANDING LYING DODGING SITTING RUNNING HOPPING HOPPING HOPPING RUNNING STANDING LYING FALLING RUNNING FLYING LYING
7. 使用接口组织枚举
在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。
package enums.menu;public interface Food {enum Appetizer implements Food {SALAD, SOUP, SPRING_ROLLS;}enum MainCourse implements Food {LASAGNE, BURRITO, PAD_THAI,LENTILS, HUMMOUS, VINDALOO;}enum Dessert implements Food {TIRAMISU, GELATO, BLACK_FOREST_CAKE,FRUIT, CREME_CARAMEL;}enum Coffee implements Food {BLACK_COFFEE, DECAF_COFFEE, ESPRESSO,LATTE, CAPPUCCINO, TEA, HERB_TEA;}
}
package enums.menu;
import static enums.menu.Food.*;public class TypeOfFood {public static void main(String[] args) {// 所有东西都是某种类型的 FoodFood food = Appetizer.SALAD;food = MainCourse.LASAGNE;food = Dessert.GELATO;food = Coffee.CAPPUCCINO;}
}
8. 使用 EnumSet 替代 Flags
Java SE5 引入 EnumSet,是为了通过 enum 创建一种替代品,以替代传统的基于 int 的“位标志”。这种标志可以用来表示某种“开/关”信息。
EnumSet 中的元素必须来自一个 enum。
下面的 enum 表示在一座大楼中,警报传感器的安放位置:
package enums;public enum AlarmPoints {STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3,OFFICE4, BATHROOM, UTILITY, KITCHEN
}
然后,我们用 EnumSet 来跟踪报警器的状态:
package enums;import java.util.EnumSet;import static enums.AlarmPoints.*;public class EnumSets {public static void main(String[] args) {// 创建一个空的 EnumSetEnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class);// 添加元素points.add(BATHROOM);System.out.println("add:" + points);points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));System.out.println("addAll:" + points);points = EnumSet.allOf(AlarmPoints.class);System.out.println("EnumSet.allOf:" + points);points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));System.out.println("removeAll:" + points);points.removeAll(EnumSet.range(OFFICE1, OFFICE4));System.out.println("removeAll-EnumSet.range:" + points);points = points.complementOf(points);System.out.println("complementOf:" + points);}
}
输出:
add:[BATHROOM]
addAll:[STAIR1, STAIR2, BATHROOM, KITCHEN]
EnumSet.allOf:[STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN]
removeAll:[LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY]
removeAll-EnumSet.range:[LOBBY, BATHROOM, UTILITY]
complementOf:[STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN]
9. 使用 EnumMap
EnumMap 是一种特殊的 Map,它要求其中的键(key)必须来自一个 enum。
package enums;import java.util.*;import static enums.AlarmPoints.*;interface Command {void action();
}public class EnumMaps {public static void main(String[] args) {EnumMap<AlarmPoints, Command> em = new EnumMap<>(AlarmPoints.class);em.put(KITCHEN,() -> System.out.println("Kitchen fire!"));em.put(BATHROOM,() -> System.out.println("Bathroom alert!"));for (Map.Entry<AlarmPoints, Command> e : em.entrySet()) {System.out.print(e.getKey() + ": ");e.getValue().action();}try { // If there's no value for a particular key:em.get(UTILITY).action();} catch(Exception e) {System.out.println("Expected: " + e);}}
}
10. 常量特定方法
Java 的 enum 有一个非常有趣的特性,即它允许程序员为 enum 实例编写方法,从而为每个 enum 实例赋予各自不同的行为。要实现常量相关的方法,你需要为 enum 定义一个或多个 abstract 方法,然后为每个 enum 实例实现该抽象方法。
package enums;public enum ConstantSpecificMethod {DATE_TIME {@Overridevoid getInfo() {System.out.println("DATE_TIME");}},CLASSPATH {@Overridevoid getInfo() {System.out.println("CLASSPATH");}};abstract void getInfo();public static void main(String[] args) {for (ConstantSpecificMethod v : values()) {v.getInfo();}}
}
调用 getInfo() 方法时,体现出多态的行为。
11. 本章小结
虽然枚举类型本身并不是特别复杂,但还是将本章安排在全书比较靠后的位置,这是因为,程序员可以将 enum 与 Java 语言的其他功能结合使用,例如多态、泛型和反射。
(图网,侵删)
相关文章:
读书笔记-《ON JAVA 中文版》-摘要25[第二十二章 枚举]
文章目录 第二十二章 枚举1. 基本功能1.1 基本 enum 特性 2. 方法添加2.1 方法添加2.2 覆盖 enum 的方法 3 switch 语句中的 enum4. values 方法的神秘之处5. 实现而非继承6. 随机选择7. 使用接口组织枚举8. 使用 EnumSet 替代 Flags9. 使用 EnumMap10. 常量特定方法11. 本章小…...
DNDC模型建模方法及应用
DNDC(Denitrification-Decomposition,反硝化-分解模型)是目前国际上最为成功的模拟生物地球化学循环的模型之一,自开发以来,经过不断完善和改进,从模拟简单的农田生态系统发展成为可以模拟几乎所有陆地生态…...
Kafka为什么是高性能高并发高可用架构
目录 1 前言2 顺序写入3 页缓存4 零拷贝5 Broker 性能6 流数据并行7 总结 1 前言 我们都知道 Kafka 是基于磁盘进行存储的,但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点,其吞吐量动辄几十上百万。小伙伴们是不是有点困惑了,一般认为…...
QT-day3
完成文本编辑器的保存工作 void Widget::on_savebton_clicked() {QString fileName QFileDialog::getSaveFileName(this,"保存","./","All(*.*);;Images(*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)");QFile file(fileName);i…...
开发自测的测试用例设计方法
测试用例设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。 测试用例就是一个文档,描述输入、动作、或者时间和一个期望的结果,其目的是确定应用程序的某个特性是否正常的工作。 一.等价类划分法 顾名思义&#x…...
【AI视野·今日Sound 声学论文速览 第七期】Tue, 19 Sep 2023
AI视野今日CS.Sound 声学论文速览 Tue, 19 Sep 2023 Totally 1 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Frame-to-Utterance Convergence: A Spectra-Temporal Approach for Unified Spoofing Detection Authors Awais Khan, Khalid Mahmood Ma…...
MySQL 清空表 截断表
清空表:delete from users; 清空表只是清空表中的逻辑数据,但是物理数据不清除,如主键值、索引等不被清除,还是原来的值。 截断表:truncate table users; 截断表可以用于删除表中 的所有数据…...
2020-2023中国高等级自动驾驶产业发展趋势研究-中国高等级自动驾驶发展近况
1.2 中国高等级自动驾驶发展近况 通过对中国高等级自动驾驶行业的观察和分析,亿欧汽车认为,除技术解决方案提供商外,如今的车企、政府、资本同样在产业链中扮演重要角色。此外,车路协同技术的发展也为高等级自动驾驶的发展提供了更…...
Spring学习之ImportBeanDefinitionRegistrar接口
一、本文内容分类 1、接口功能 2、接口运用场景 3、使用案例 4、注意事项 二、接口功能介绍 描述:ImportBeanDefinitionRegistrar接口是也是spring的扩展点之一,它可以支持我们自己写的代码封装成BeanDefinition对象,注册到Spring容器中,功能类似于注…...
React 全栈体系(八)
第四章 React ajax 三、案例 – github 用户搜索 2. 代码实现 2.3 axios 发送请求 Search /* src/components/Search/index.jsx */ import React, { Component } from "react"; import axios from axiosexport default class Search extends Component {search …...
4.开放-封闭原则
这个原则其实是有两个特征,一个是说‘对于扩展是开放的(Open for extension),另一个是说‘对于更改是封闭的(Closed for modification)[ASD]。...
oracle递归with子句
比如现在想获取开始日期到结束日期每个月的月底日期,这个时候可以通过递归实现: --通过递归with子句获取开始日期到结束日期每个月的月末日期 WITH date_range (month_start, month_end) AS (SELECT TRUNC(to_date(bdate,yyyy-mm-dd), MM),LAST_DAY(to_…...
如何在Proteus进行STM32F103C8T6模拟以及keil5开发
一、下载Proteus 8和keil5 最新版 Proteus 8.15 Professional 图文安装教程(附安装包)_proteus密钥_main工作室的博客-CSDN博客Keil uVision5 5.38官方下载、安装及注册教程_keil uvision5下载_这是乐某的博客-CSDN博客 二、新建STM32F103C8项目 接下来…...
C# OpenCvSharp 图片模糊检测(拉普拉斯算子)
效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyl…...
志高团队:广阔前景 全新的投资理财体验
当今时代,数字金融迅猛发展,投资理财领域正在经历前所未有的重大变革。作为加拿大华企联合会控股旗下的重要项目,恒贵即将启动,旨在为广大投资者带来全新的投资理财体验。这一创新项目的优势和广阔前景受到了业内观察机构的广泛关注和期待。 恒贵作为一家全新的P2C多元化投资理…...
基于自编译的onlyoffice镜像,关于修改字体的问题
基于自编译的onlyoffice镜像,关于修改字体的问题 自编译onlyoffice镜像来自于 https://blog.csdn.net/Gemini1995/article/details/132427908 该镜像里面没有documentserver-generate-allfonts.sh文件,所以需要自己创建一个(建议放在/usr/b…...
1.wifi开发,wifi连接初次连接电脑没有识别,搭建环境
wifi连接初次连接电脑没有识别 1.不识别可能是线的问题,即使wifi的灯亮了,虽然串口却没有找到。所以解决方法就是重新来一个usb的线 一。初步使用 (1)使用ESP烧写工具(选择esp8266) (2…...
【JAVA-Day25】解密进制转换:十进制向R进制和R进制向十进制的过程
解密进制转换:十进制向R进制和R进制向十进制的过程 一、什么是进制转换1.1 进制1.2 进制转换 二、十进制转R进制2.1 转换算法2.2 示例代码 三、R进制转十进制3.1 转换算法3.2 示例代码 四、总结参考资料 ) 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的…...
牛客网字节面试算法刷题记录
NC78 反转链表 public ListNode ReverseList (ListNode head) {if(headnull) return head;ListNode phead.next,q,tailhead;tail.next null;while(p!null){q p.next;p.next tail;tail p;p q;}return tail;} NC140 排序 冒泡排序 public int[] MySort (int[] arr) {for…...
QT连接Sqlite
使用QTCreator; 根据资料,Qt自带SQLite数据库,不需要再单独安装,默认情况下,使用SQLite版本3,驱动程序为***QSQLITE***; 首先创建项目;在 Build system 中应选中qmake,…...
ChatGPT AIGC 完成各省份销售动态可视化分析
像这样的动态可视化由人工智能ChatGPT AIGC结合前端可视化技术就可以实现。 Prompt:请使用HTML,JS,Echarts 做一个可视化分析的案例,地图可视化,数据可以随机生成,请写出完整的代码 完整代码复制如下: <!DOCTYPE html> <html> <head><meta char…...
基于SpringBoot+Vue的餐饮管理系统设计与实现
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
2023 亲测好用版VScode配置文件
tasks.json {"tasks": [{"type": "cppbuild","label": "g++",// 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc 和launch中preLaunchTask保持一致// "command": "D:/Users/Downloads/ming…...
jmeter基础压力教程
Jmeter基础压力测试教程 一、安装Jmeter; 安装需求:1. JDK 8.0.91安装包(最新即可,配置环境变量) 2. Badboy2.25脚本录制工具(注:Jmeter3.0与badboy2.0不兼容) Jmerter安装包…...
图片格式大全
青春不能回头,青春也没有终点。 大全介绍 图片格式有多种,每种格式都有其独特的特性和用途。以下是一些常见的图片格式以及它们的介绍: JPEG(Joint Photographic Experts Group): 文件扩展名:…...
5.14.1.2 Get Log Page – Smart Log
SMART / Health Information (Log Identifier 02h) smart log 可通过nvme cli获取如下: 同样也可以通过get-log 命令获取到原始数据如下: 此日志页用于提供SMART和常用的helath 信息。所提供的信息在控制器的使用寿命内,并在整个power cycle前后都保留。要访问控制器日志…...
【深度学习实验】线性模型(一):使用NumPy实现简单线性模型:搭建、构造损失函数、计算损失值
#【中秋征文】程序人生,中秋共享# 目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义线性模型linear_model 2. 定义损失函数loss_function 3. 定义数据 4. 调用函数 一、实验介绍 使用Numpy实现 线性模型搭…...
springcloud3 分布式事务-seata的四种模式总结以及异地容灾
一 seata四种模式比较 1.1 seata的4种模式比较 二 seata的高可用 2.1架构 1.建TC服务集群非常简单,启动多个TC服务,注册到nacos即可。 2.做异地多机房容灾,比如一个TC集群在上海,另一个TC集群在杭州, 3.微服务基…...
【办公类-16-06】20230901大班运动场地分配表-斜线排列、5天循环、不跳节日,手动修改节日”(python 排班表系列)
背景需求: 大班组长发来一个“运动排班”的需求表:“就是和去年一样的每个班的运动排班,就因为今年大班变成7个班,删掉一个场地,就要重新做一份,不然我就用去年的那份了(8个大班排班࿰…...
java学习--day13 (static关键字、异常)
文章目录 day12复习今天的内容1.static关键字【重点】1.1生活的角度来理解静态的资源1.2Java中的静态1.2.1static修饰成员变量1.2.2static修饰成员方法1.2.3static修饰代码块 2.异常2.1生活中的异常2.2Java中的异常2.3Throwable类2.4错误和异常2.5异常【重点】2.5.1异常的捕捉2…...
好的企业网站建设/东莞企业推广网站制作
C语言谭浩强版6章课后练习题答案第6章课后练习题单项选择题以下程序执行后,a是:int a 0,i,j;for (i5;i>0;i--)for(j0;j<4;j) a;20252430执行以下程序段,正确的是:int x-1;do {xx*x; } while(! x);循环体将执行一…...
个人博客网站教程/什么时候网络推广
飞跃原野一秒钟杀死互联网。 这就是全部。 昨天的second秒使原子钟与地球自转对齐,导致广泛的在线混乱,因为准备不足的网站和软件花费了额外的秒。 在格林尼治标准时间午夜cho睡的人中,Reddit,Gawker, StumbleUpon&am…...
毕设web网站开发/p2p万能搜索种子
一、概念 IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译为“控制反向”或者“控制倒置”。二、什么是IoC IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。在Spring中控制反转是Spring框架的核…...
知道ip域名如何进入网站/域名注册后如何建网站
存储过程1: 什么是 存储过程带有逻辑的 sql的语句1: 之前的sql 没有条件判断 没有循环存储过程 带上流程控制语句 (if where)现在开始用有逻辑的 sql 语句 写2——1:存储过程特点1) 执行效率非常快 存储过程 是在数据库中的服务器端执行的!&…...
php创建网站/企业整站优化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Dart中函数定义内置函数自定义函数二、函数传参可选参数默认参数命名参数函数作为参数进行传递三、特别函数箭头函数自执行函数函数闭包总结前言 本篇是笔者…...
17网站一起做网店普宁池尾雅晨/微信管理软件
【第1篇】我的兴趣爱好从小到大,我的兴趣爱好有很多,但我是一个三分钟热度、且急性子的人,所以我对事物的的兴趣总是坚持不了多久。看见别人绣的十字绣,我也兴致勃勃地绣了一会儿,又因为枯燥而将那块布弃而不顾&#x…...