在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例:
Java代码
public class WeekDay {
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
public static final int WENSDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
}
现在,你的类就可以使用像WeekDay.TUESDAY这样的常量了。但是这里隐藏着一些问题,这些常量是Java中int类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和WeekDay中定义的所有日期都对应不上。因此,您需要检测上界和下界,在出现无效值的时候,可能还要抛出一个IllegalArgumentException。而且,如果后来又添加另外一个日期(例如WeekDay.SATURDAY ),那么必须改变所有代码中的上界,才能接受这个新值。 换句话说,在使用这类带有整型常量的类时,这个方案也许可行,但并不是非常有效。
Joshua Bloch老大这时站了出来,在他的著作《Effective Java》中提出了在这样场景下的一种非常好的模式——Type-safe enumeration pattern。这个模式简而言之就是给这样的常量类一个私有的构造方法,然后声明一些public static final 的同类型的变量暴露给使用者,例如:
Java代码
public class WeekDay {
public static final WeekDay MONDAY = new WeekDay(1);
public static final WeekDay TUESDAY = new WeekDay(2);
public static final WeekDay WENSDAY = new WeekDay(3);
public static final WeekDay THURSDAY = new WeekDay(4);
public static final WeekDay FRIDAY = new WeekDay(5);
public int getValue(){
return value;
}
private int value;
private WeekDay(int i){
this.value = i;
}
//other methods...
}
这样做的好处是你的程序现在接受的不是int类型的数据了,而是WeekDay的一个预定义好的static final的实例(WeekDay.TUESDAY等 ),例如:
Java代码
public void setWeekDay(WeekDay weekDay){...}
而这样做也避免了可以随意向方法中传递一个不合法的int型数值(例如-1)而造成程序错误。同时,它还会带来其他的一些好处:由于这些枚举的对象都是一些类的实例,所以在里面放一些需要的属性来存放数据;又由于他们都是单例的,你可以使用equals方法或是==符号来比较它们。
Joshua Bloch大大提出的枚举模式,很好用但是好麻烦啊。如果你用过C/C++或是Pascal这样的语言的话一定会对它们的枚举类型有印象,例如在C/C++中我们可以这样定义:
C/C++代码
enum weekday {
MONDAY,
TUESDAY,
WENSDAY,
THURSDAY,
FRIDAY
};
然后在程序中就可以用MONDAY、TUESDAY这些变量了。这样多方便,但是Java 1.4以前的版本并没有提供枚举类型的支持,所以如果你是用JDK 1.4开发程序的话就只能像Joshua Bloch老大那样写了。从Java 5.0(代号为Tiger)开始,这种情况改变了,Java从语言层面支持了枚举类型。
枚举是Tiger的一个很重要的新特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示,它使用“enum”关键字来定义。
我们先来写一个简单的枚举类型的定义:
Java代码
public enum WeekDay{
MONDAY, TUESDAY, WENSDAY, THURSDAY, FRIDAY; //最后这个“;”可写可不写。
}
这和类、接口的定义很相像嘛!Tiger中的枚举类型就是一种使用特殊语法“enum”定义的类。所有的枚举类型是java.lang.Enum的子类。这是Tiger中新引入的一个类,它本身并不是枚举类型,但它定义了所有枚举类型所共有的行为,如下表:
注意:虽然所有的枚举类型都继承自java.lang.Enum,但是你不能绕过关键字“enum”而使用直接继承Enum的方式来定义枚举类型。编译器会提示错误来阻止你这么做。
WeekDay中定义的五个枚举常量之间使用“,”分割开来。这些常量默认都是“public static final”的,所以你就不必再为它们加上“public static final”修饰(编译器会提示出错),这也是为什么枚举常量采用大写字母来命名的原因。而且每一个常量都是枚举类型WeekDay的一个实例。你可以通过类似“WeekDay.MONDAY”这种格式来获取到WeekDay中定义的枚举常量,也可以采用类似“WeekDay oneDay = WeekDay.MONDAY”的方式为枚举类型变量赋值(你不能给枚举类型变量分配除了枚举常量和null以外的值,编译器会提示出错)。
作为枚举类型实例的枚举常量是如何初始化的呢?其实答案很简单,这些枚举常量都是通过Enum中定义的构造函数进行初始化的。
Java代码
//java.lang.Enum中定义的构造函数,
//两个参数分别是定义的枚举常量名称以及它所在的次序。
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
在初始化的过程中,枚举常量的次序是按照声明的顺序安排的。第一个枚举常量的次序是0,依此累加。
枚举类型除了拥有Enum提供的方法以外,还存在着两个隐藏着的与具体枚举类型相关的静态方法——values()和valueOf(String arg0)。方法values()可以获得包含所有枚举常量的数组;方法valueOf是java.lang.Enum中方法valueOf的简化版本,你可以通过它,根据传递的名称来得到当前枚举类型中匹配的枚举常量。
我们来看一个枚举类型使用的小例子。需求中要求可以对指定的日期进行相应的信息输出。对于这么简单的需求,这里就使用枚举类型来进行处理。前面我们已经定义好了包含有五个工作日的枚举类型。下面的代码则是进行输出的方法:
Java代码
/**
* 根据日期的不同输出相应的日期信息。
* @param weekDay 代表不同日期的枚举常量
*/
public void printWeekDay(WeekDay weekDay){
switch(weekDay){
case MONDAY:
System.out.println(“Today is Monday!”);
break;
case TUESDAY:
System.out.println(“Today is Tuesday!”);
break;
case WENSDAY:
System.out.println(“Today is Wensday!”);
break;
case THURSDAY:
System.out.println(“Today is hursday!”);
break;
case FRIDAY:
System.out.println(“Today is Friday!”);
break;
default:
throw new AssertionError("Unexpected value: " + weekDay);
}
}
在Tiger以前,switch操作仅能对int、short、char和byte进行操作。而在Tiger中,switch增加了对枚举类型的支持,因为枚举类型仅含有有限个可以使用整数代替的枚举常量,这太适合使用switch语句了!就像上面代码中那样,你在swtich表达式中放置枚举类型变量,就可以在case标示中直接使用枚举类型中的枚举常量了。
注意:case标示的写法中没有枚举类型前缀,这意味着不能将代码写成 case Operation. PLUS,只需将其写成 case PLUS即可。否则,编译器会提示出错信息。
像上面的例子一样,虽然你已经在case标示中穷尽了某个枚举类型中的所有枚举常量,但还是建议你在最后加上default标示(就像上面代码示意的那样)。因为万一为枚举类型添加一个新的枚举常量,而忘了在switch中添加相应的处理,是很难发现错误的。
为了更好的支持枚举类型,java.util中添加了两个新类:EnumMap和EnumSet。使用它们可以更高效的操作枚举类型。下面我一一介绍给你:
EnumMap是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。
提示:EnumMap在内部使用枚举类型的ordinal()得到当前实例的声明次序,并使用这个次序维护枚举类型实例对应值在数组的位置。
下面是使用EnumMap的一个代码示例。枚举类型DataBaseType里存放了现在支持的所有数据库类型。针对不同的数据库,一些数据库相关的方法需要返回不一样的值,示例中getURL就是一个。
Java代码
//现支持的数据库类型枚举类型定义
public enum DataBaseType{
MYSQL,ORACLE,DB2,SQLSERVER
}
//某类中定义的获取数据库URL的方法以及EnumMap的声明。
……
private EnumMap<DataBaseType ,String> urls =
new EnumMap<DataBaseType ,String>(DataBaseType.class);
public DataBaseInfo(){
urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");
urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb");
urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample");
urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb");
}
/**
* 根据不同的数据库类型,返回对应的URL
* @param type DataBaseType枚举类新实例
* @return
*/
public String getURL(DataBaseType type){
return this.urls.get(type);
}
在实际使用中,EnumMap对象urls往往是由外部负责整个应用初始化的代码来填充的。这里为了演示方便,类自己做了内容填充。
像例子中那样,使用EnumMap可以很方便的为枚举类型在不同的环境中绑定到不同的值上。如:例子中getURL绑定到URL上,在其它的代码中可能又被绑定到数据库驱动上去。
EnumSet是枚举类型的高性能Set实现。它要求放入它的枚举常量必须属于同一枚举类型。EnumSet提供了许多工厂方法以便于初始化,见下表:
EnumSet作为Set接口实现,它支持对包含的枚举常量的遍历:
Java代码
for(Operation op : EnumSet.range(Operation.PLUS , Operation.MULTIPLY)) {
doSomeThing(op);
}
相关推荐
MineMap开发教程: 北斗网格位置码实时调度技术详解
本文介绍了MineMap4.0引擎中北斗网格位置码的实时调度技术。北斗网格位置码是我国自主研发的空间位置编码标准,具有层次化结构、三维编码等特点。MineMap4.0通过BeiDouGrid类实现了高效的实时调度机制,重点展示了按预想高度进行网格调度的核心功能。关键技术包括视锥体裁剪、LOD控制、高度筛选算法和交互式查询等。该技术在智慧城市、环境监测等领域具有广泛应用前景,凭借高性能、高精度等优势,为三维地理信息可视化提供了有力支撑。
Java中枚举类的定义以及使用
看到这个标题,很多人不禁要问---什么是枚举类而且为什么用枚举类呢?那是因为,一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。 举个简单的例子,我们每个人都有性别,分为“男”和“女”两种,为了限定这两种情况我们就必须限定这两种情况。下面就请大家看看怎样几种手动的实现枚举的方法
华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具
参考文档1这个工具可以完美替代华硕奥创中心工具,可以定制化不同模式下的CPU、GPU、风扇转速、电池计划等。是由华硕开发人员开发的一个纯绿色的系统管理工具。直接展示启动后的工具界面效果图:这个工具也可以一键式停止正在运行的华硕ASUS服务,减少不必要的资源消耗。
黑马程序员—知识点补充(枚举)
-------------------------------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 什么是枚举: 在JDK中是1.5的新特性,是一个叫ENUM的类,是Java枚举类型的公共基本类。 枚举目的就是要让某个变量的取值只能为若干固定值中的一个
AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)
用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。
从零搭建Python接口自动化测试框架:pytest+requests+Allure实战指南
接口自动化测试是现代软件工程中保障交付质量、提升测试效率的核心实践。其基本原理是通过脚本模拟客户端请求,对服务端接口进行自动化的功能验证、性能探测与回归测试,从而替代重复的手工操作。在技术实现上,Python凭借其简洁语法和丰富的生态,成为构建此类框架的主流选择,其中pytest测试框架、requests HTTP库和Allure报告工具构成了技术栈的黄金组合。这套技术方案的价值在于,它能将测试用例数据(如YAML文件)与执行逻辑分离,实现数据驱动测试,并通过持续集成(如Jenkins)无缝融入DevOps
【Java面试题】定义枚举类型Weekday,使用枚举类型配合switch语句,尝试如下功能:
定义枚举类型Weekday,使用枚举类型配合switch语句,尝试如下功能: wd = Mon是输出“Do Monday work”,wd = Tue时,输出“Do Monday work”,以此类推,当wd不为枚举值元素值时输出“I don`t know which is day”。 实现代码如下: package workspace; enum Weekday{Mon,Tue,Wed...
OPPO 数据分析面试题及参考答案
如何设计共享单车数据库的各个字段? 对于共享单车的数据库设计,首先考虑用户相关的字段。用户表可以包含用户 ID,这是一个唯一标识符,用于区分不同用户;姓名,记录用户的真实姓名;联系方式,比如手机号码,方便在出现问题时联系用户;注册时间,记录用户何时开始使用共享单车服务;信用分数,用于衡量用户使用共享单车过程中的行为是否合规,比如是否按时归还车辆等。 车辆信息表要有车辆 ID,这是车辆的唯一标识;车辆类型,例如普通单车、电动单车等;投放时间,即车辆投放到市场的时间;车辆状态,包括是否可用(如正
Java中的枚举类型-1:基本用法
枚举是Java 5开始支持的新特性,其作用是将一组相关的常量定义在一个类型中,这样在使用时就只能使用这些有限的常量。先定义一个代表一周七天的枚举类型作为范例: enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURDAY }; 这样就定义好了一个Weekday枚举类型,注意最后的分号是可以省...
【测绘程序设计】——潮汐调和分析
最小二乘潮汐调和分析源码、使用示例及数据
KEPServerEX作为MQTT客户端
打开软件: 测试没有连接上MQTT代理。
java 中的枚举_说说Java中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例:Java代码public class WeekDay {public staticfinal int MOND...
Three.js 完整实战项目:构建一个 3D 商品展示空间
Three.js 作为强大的 WebGL 框架,广泛应用于交互式 3D 场景开发,尤其适合创建沉浸式商品展示空间。本文将通过一个完整的实战项目,展示如何构建一个 3D 商品展示空间,涵盖项目架构、资源组织、多模型切换、交互热点绑定、移动端适配和帧率优化。项目以展示虚拟商品(如家具或电子产品)为核心,结合用户交互,基于 Vite、TypeScript 和 Tailwind CSS,支持 ES Modules,确保响应式布局,遵循 WCAG 2.1 可访问性标准。本文适合希望通过综合项目掌握 Three.js
聊一聊Java的枚举enum
枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景,本文主要介绍了枚举enum主要特点,定义,无参构造器,有参构造器,枚举的常用方法举例以及主要的应用场景,若有不对之处,请批评指正,望共同进步,谢谢!
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
java 枚举 values_JAVA 枚举运用一 values方法
importjava.lang.reflect.Method;importjava.lang.reflect.Type;importjava.util.Set;import java.util.*;public classEnumJavaClass {public enumEnumClass{One("参数变量枚举一"),Two("参数变量枚举二"),Three("参数变量枚举三");priva...
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
java语言枚举有什么用_Java枚举梳理总结一
1.枚举允许继承类吗?枚举不允许继承类。Jvm在生成枚举时已经继承了Enum类,由于Java语言是单继承,不支持再继承额外的类(唯一的继承名额被Jvm用了)。2.枚举允许实现接口吗?枚举允许实现接口。因为枚举本身就是一个类,类是可以实现多个接口的。3.枚举可以用等号比较吗?枚举可以用等号比较。Jvm会为每个枚举实例对应生成一个类对象,这个类对象是用public static final修饰的,在s...
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
扒一扒: Java 中的枚举
目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类的实例...
Java 枚举一 Enum解析
1.enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。先来看可他的定义 public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable{ //构造 protected Enum(...
java中枚举详解_Java 枚举用法详解(一)
概念enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性。在Java中,被 enum 关键字修饰的类型就是枚举类型。形式如下:enum Color { RED, GREEN, BLUE }如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以 Color 枚举类型举例,它的枚举常量依次为RED:0,GREEN:1,BLUE:2枚举的好处:可以将常量组织起来,统一进行...
【java基础回顾一】——枚举
java枚举 【前言】这段时间正好忙完了前面的项目可以jing
Java中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例: Java代码public class WeekDay { public static final int MONDAY = 1; public static final int TUESDAY
重走JAVA编程之路(一)枚举
Java 1.5 发行版本增加了新的引用类型: 枚举, 在其之前,我们使用枚举类型值的时候通常是借助常量组成合法值的类型,例如表示光的三原色:红黄蓝的代码表示可能是以下这样的。 /*******************光的三原色*********************/ public static final int LIGHT_RED = 1; public stati...
用上Java的Enum枚举 玩一玩课堂点到
本文讲解Java中的枚举类,以及一个小应用——课堂点到系统
Java之枚举、注解、异常、集合【一】
枚举、注解、异常、集合【一】
【枚举一】Java 枚举7常见种用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:swi
JAVA中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例: publicclassWeekDay{ publicstati...
1461



被折叠的 条评论
为什么被折叠?



