枚举。实用例子。添加构造函数和方法
嗨今天我们将讨论Java的一个特殊数据类型“枚举”enmulation的缩写。 它有什么特别之处让我们想象一下在一个项目中实现“月数”需要什么。 看起来没什么问题对吧我们只需要确定每个月都有哪些属性。也许我们首先需要月份的名字和月份的天数。 解决方案看起来很简单整个“shabang” 我们有一个类需要字段getter/setter和 。除非我们需要增加并实现完全的幸福:)但这里我们面临一个概念性的问题。 你可能还记得面向对象编程的主要优势之一是它可以轻松模拟现实世界的实体。一把椅子、一辆车、一颗行星——所有这些来自日常生活的概念都可以通过抽象的帮助轻松地在程序中表现。 问题在于现实世界中的一些实体的值范围非常有限。 一年只有四个季节。 一个八度里只有8个音符。 日历只有12个月。 而《十一罗汉》的丹尼·欧申只有11个朋友不过这:)无关紧要 重要的是普通的Java类无法建模这些实体并强制执行它们的自然限制。 我们这门课有所有必填字段。但如果是其他程序员使用它没人能阻止他或她创造完全疯狂的对象Enumpublic class Month { private String name; private int daysCount; public Month(String name, int daysCount) { this.name name; this.daysCount daysCount; } public String getName() { return name; } public void setName(String name) { this.name name; } public int getDaysCount() { return daysCount; } public void setDaysCount(int daysCount) { this.daysCount daysCount; } Override public String toString() { return Month{ name name \ , daysCount daysCount }; } }MonthtoString()equals()hashCode()Month​编辑public class Main { Month month1 new Month(lolkek, 322); Month month2 new Month(yahoooooooooooo, 12345); }如果这出现在我们的代码里找出罪魁祸首可不容易一方面创建对象的程序员可能会意识到这个类意味着“一年中的一个月”就不会写出这些胡言乱语。 另一方面程序员只是利用了类设计师提供的技能。可以任意分配名称和天数吗这正是我们得到的。 那我们在这种情况下该怎么办说实话在 Java 1.5 发布之前程序员们不得不发挥创意:) 那时他们创造了这样的结构这里我们把月份数从十二个月缩短到三个以缩短示例。 这种设计使得问题得以解决。创建对象的能力仅限于私有构造器使用该类的程序员不能简单地创建对象。他们必须使用类开发者提供的最终静态对象。 比如这样但是Java开发者指出了现有的问题。当然程序员们能用语言中可用的工具找到解决方案固然好但看起来并不容易即使是新手也需要一个显而易见的解决方案。 于是爪哇岛也出现了。 基本上是一个提供有限对象值集的Java类。 情况如下在定义中我们表示这是一个 Java 类但这真的是真的吗是的我们甚至可以验证。 例如试着让我们的枚举继承另一个类为什么会这样 当我们写入编译器将此语句转换为以下代码正如你已经知道的Java 不支持多重继承。因此我们无法继承 。 这个新构造如何被使用它和旧的场构造有什么不同 举个例子旧的构造并不允许我们在语句中使用自己的数值集合。 想象一下我们想创建一个程序提醒我们每个月庆祝的节日正如你所见编译器在这里抛出了一个错误。 但一旦出现在 Java 1.5 中一切都变得简单得多控制台输出注意对对象的访问保持静态就像 Java 1.5 之前一样。我们不需要创建对象来访问月份。 在处理枚举时非常重要的一点是不要忘记它是一门完整的课程。 这意味着如果需要你可以在其中定义构造函数和方法。 例如在之前的代码片段中我们简单地指定了数值JANUARY FEBRUARY MARCH. 不过我们可以这样扩展我们的枚举Monthpublic class Month { private String name; private int daysCount; private Month(String name, int daysCount) { this.name name; this.daysCount daysCount; } public static Month JANUARY new Month(January, 31); public static Month FEBRUARY new Month(February, 28); public static Month MARCH new Month(March, 31); Override public String toString() { return Month{ name name \ , daysCount daysCount }; } }private Month(String name, int daysCount) { this.name name; this.daysCount daysCount; }Monthpublic class Main { public static void main(String[] args) { Month january Month.JANUARY; System.out.println(january); } }EnumEnumpublic enum Month { JANUARY, FEBRUARY, MARCH }EnumMonthpublic abstract class AbstractMonth { } // Error! The extends clause cannot be used with an enum public enum Month extends AbstractMonth { JANUARY, FEBRUARY, MARCH }public enum Monthpublic Class Month extends EnumAbstractMonthEnumstatic finalswitchpublic class HolidayReminder { public void printHolidays(Month month) { switch (month) { // Error! case JANUARY: } } }enumpublic enum Month { JANUARY, FEBRUARY, MARCH } public class HolidayReminder { public void printHolidays(Month month) { switch (month) { case JANUARY: System.out.println(New Years Day is January 1st!); break; case FEBRUARY: System.out.println(Valentines Day is February 14th!); break; case MARCH: System.out.println(Saint Patricks Day is March 17th!); break; } } } public class Main { public static void main(String[] args) { HolidayReminder reminder new HolidayReminder(); reminder.printHolidays(Month.JANUARY); } }New Years Day is January 1st!EnumMonthEnumMonthpublic enum Month { JANUARY(January, 31), FEBRUARY(February, 28), MARCH(March, 31), APRIL(April, 30), MAY(May, 31), JUNE(June, 30), JULY(July, 31), AUGUST(August, 31), SEPTEMBER(September, 30), OCTOBER(October, 31), NOVEMBER(November, 30), DECEMBER(December, 31); private String name; private int daysCount; Month(String name, int daysCount) { this.name name; this.daysCount daysCount; } public static Month[] getWinterMonths() { return new Month[]{DECEMBER, JANUARY, FEBRUARY}; } public static Month[] getSummerMonths() { return new Month[]{JUNE, JULY, AUGUST}; } public String getName() { return name; } public void setName(String name) { this.name name; } public int getDaysCount() { return daysCount; } public void setDaysCount(int daysCount) { this.daysCount daysCount; } Override public String toString() { return Month{ name name \ , daysCount daysCount }; } }​编辑这里我们给出了两个字段月份名称和天数、使用这些字段的构造器、getter/setter、方法和两个静态方法。 如你所见这过程中没有任何问题。同样这确实是一个完整的课程控制台输出最后我想推荐一本非常有用的Java书即Joshua Bloch的《Effective Java》。作者是Java的创始人之一所以你可以完全信任他关于如何正确且熟练地使用语言工具的建议:) 关于我们的课程我建议你特别关注书中关于 的章节。 祝阅读愉快:)enumtoString()Enumimport java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println(Arrays.toString(Month.getSummerMonths())); } }[Month{nameJune, daysCount30}, Month{nameJuly, daysCount31}, Month{nameAugust, daysCount31}]

相关新闻

Mixtral-8x7B推理瓶颈诊断:PyTorch Profiler与record_function实战指南

Mixtral-8x7B推理瓶颈诊断:PyTorch Profiler与record_function实战指南

1. 项目概述:为什么 Mixtral-8x7B 的推理性能不能只靠“换卡”解决?Mixtral-8x7B 是当前开源社区中极具代表性的稀疏混合专家(MoE)模型,它在保持 7B 级别参数量的同时,通过 8 个专家(Experts&am…

2026/7/10 6:21:09阅读更多 →
ExifToolGui完整指南:3分钟学会免费批量管理照片元数据

ExifToolGui完整指南:3分钟学会免费批量管理照片元数据

ExifToolGui完整指南:3分钟学会免费批量管理照片元数据 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 还在为成百上千张照片的元数据管理而头疼吗?想修改拍摄时间却只能一张一张操作…

2026/7/10 6:21:09阅读更多 →
工业信号干扰防护与高速光耦FOD4216应用解析

工业信号干扰防护与高速光耦FOD4216应用解析

1. 工业环境中的信号干扰挑战在电机控制、PLC系统或自动化产线等工业场景中,电磁干扰(EMI)就像一场永不停止的电子风暴。我曾在汽车焊接产线调试时遇到过这样的场景:每当大功率焊机启动,所有传感器的485通信就会集体&q…

2026/7/10 6:21:09阅读更多 →
Unity3D视频与模型透视投影融合:从原理到工业级实现

Unity3D视频与模型透视投影融合:从原理到工业级实现

1. 项目概述:当虚拟模型“看见”真实世界在Unity3D的世界里,我们早已习惯了构建一个完全由代码和美术资源构成的虚拟空间。但你是否想过,如果能让这个虚拟世界“看见”并“理解”我们身处的真实世界,会发生什么?这就是…

2026/7/10 7:36:13阅读更多 →
后端开发者必备的缓存策略与实战经验

后端开发者必备的缓存策略与实战经验

别等系统崩溃才想起缓存凌晨两点,监控告警疯狂闪烁,数据库连接池耗尽,所有接口响应时间飙到十秒以上。你翻看代码,发现一个高频查询接口居然每次都在直查数据库。这不是段子,这是我真实经历过的生产事故。缓存的缺席&a…

2026/7/10 7:36:13阅读更多 →
用Flask框架搭建轻量级API服务的实践指南

用Flask框架搭建轻量级API服务的实践指南

你需要一个轻量级的Python API服务。别用Django那样的重型框架把自己压得喘不过气,也别手写半个世纪的HTTP解析器。Flask就是那把手术刀——小而锋利,五百行代码就能撑起一个生产级的微服务。本文不会教你“hello world”,那是文档的活儿。我…

2026/7/10 7:36:13阅读更多 →
GWO 算法求解 MTSP 问题:MATLAB 代码实现与 50 城市 3 旅行商案例解析

GWO 算法求解 MTSP 问题:MATLAB 代码实现与 50 城市 3 旅行商案例解析

GWO算法求解MTSP问题:MATLAB代码实现与50城市3旅行商案例解析1. 灰狼优化算法原理与MTSP问题适配灰狼优化算法(Grey Wolf Optimizer, GWO)作为一种新兴的群体智能优化方法,其核心思想源自灰狼群体的社会等级制度和协作狩猎机制。在…

2026/7/10 7:36:13阅读更多 →
达梦数据库(DM8)逻辑备份与还原

达梦数据库(DM8)逻辑备份与还原

【2025最新】ArcGIS for JS二维底图与三维地图的切换哈希扩展学习缓存总线是什么?【AI时代速通QT】第七节:Visual Studio Qt 开发指南解决django.db.utils.OperationalError: attempt to write a readonly database错误EXCEL哪个版本开始支持VSTO-office…

2026/7/10 7:36:13阅读更多 →
Grok AI助手:多模态交互与实时信息获取技术解析

Grok AI助手:多模态交互与实时信息获取技术解析

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个备受关注的项目——Grok AI助手。作为SpaceXAI开发的人工智能助手,Grok最近发布了全新标语"Just Gr…

2026/7/10 7:31:13阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →