Java学习笔记(4)——枚举类型

1.在类别(Class)或接口(Interface)中宣告常数加以管理,这只是让您存取与管理常数方便而已,来看看这个例子:

public void someMethod() {....doOp(OpConstants.TURN_RIGHT);....
}
public void doOp(int op) {switch(op) {case OpConstants.TURN_LEFT:System.out.println("向左转");break;case OpConstants.TURN_RIGHT:System.out.println("向右转");break;case OpConstants.SHOOT:System.out.println("射击");break;}
}

看来是不错,但doOp()方法接受的是int,您没有阻止粗心的程序设计人员对它输入OpConstants中规定外的其它常数,您也没有检查 switch中列举的值是不是正确的值,因为它骨子里就只是int而已

当然您可以作一些检查,这需要一些额外的工作,如果您使用 J2SE 5.0,则这些额外的工作您不用亲自处理,使用列举型态(Enumerated Types)可以轻易的解决这些问题。

在J2SE 5.0中使用列举型态要使用"enum"关键词,以下先来看看列举型态的应用,举个实际的例子:

OpConstants.java
public enum OpConstants {TURN_LEFT, TURN_RIGHT, SHOOT}

不用怀疑,在OpConstants.java中写下以上的内容,然后用javac去编译它,虽然语法上不像,但列举型态骨子里就是一个类别,所以您编译完成后,会产生一个OpConstants.class档案。

来看下面这个例子了解如何使用定义好的列举型态:

Test.java
public class Test {public static void main(String[] args) {doOp(OpConstants.TURN_RIGHT);}public static void doOp(OpConstants opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左转");break;case TURN_RIGHT:System.out.println("向右转");break;case SHOOT:System.out.println("射击");break;}}
}

执行结果:

向右转

除了让您少打一些字之外,好像没有什么特别的,但如果您对doOp()方法输入其它的值,编译器会回报错误,因为doOp()所接受的是 OpConstants列举型态。

更进一步的,如果您在switch中加入了不属于OpConstants中列举的数值,编译器也会回报错误,例如:

....
public static void doOp(OpConstants opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左转");break;case TURN_RIGHT:System.out.println("向右转");break;case SHOOT:System.out.println("射击");break;case STOP:System.out.println("停止");break;}
}
....

编译器会替您作编译时期的检查,若检查出不属于OpConstant中的列举值,会显示以下的错误:

unqualified enumeration constant name required
case STOP:
^

您可以在一个独立的档案中宣告列举值,或是在某个类别中宣告列举成员,例如:

Test.java
public class Test {private enum OpConstant {TURN_LEFT, TURN_RIGHT, SHOOT};public static void doOp(OpConstant opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左转");break;case TURN_RIGHT:System.out.println("向右转");break;case SHOOT:System.out.println("射击");break;}}public static void main(String[] args) {doOp(OpConstant.TURN_LEFT);}
}

由于列举型态本质上还是个类别,所以这种方式有些像在宣告 内 部类别(Iinner class), 在您编译完Test.java档案后,除了Test.class之外,您会有一些额外的.class档案,在这个例子中就是Test$ OpConstants.class与Test$1.class,看到后两个档案,您就应该了解到这个程序的背后运作的有内部成员类别以及内部匿名类别。

2.

定义列举型态时本质上就是在定义一个类别,只不过很多细节由编译器帮您补齐了,所以某些程度上,enum关键词的 作用就像是class或interface。

当您使用"enum"定义列举型态时,实质上您定义出来的型态继承自 java.lang.Enum 类别,而每个列举的成员其实就是您定义的列举型态的一个实例(Instance),它们都被预设为 final,所以您无法改变它们,它们也是 static 成员,所以您可以透过型态名称直接使用它们,当然最重要的,它们都 是公开的(public)。

举个例子:

OpConstants.java
public enum OpConstants {TURN_LEFT, TURN_RIGHT, SHOOT} 

在这个例子中,OpConstants继承自 java.lang.Enum,每个列举成员如TURN_LEFT、TURN_RIGHT、SHOOT,它们都是OpConstants的一个对象实例, 即是 对象实例,上面自然有一些方法可以采用,例如toString()方法被重新定义了,可以让您直接取得列举值的字符串描述,而列举对象定义的values ()方法可以让您取得所有的列举实例,并以数组方式传回,您使用这两个方法来简单的将OpConstants的内容显示出来:

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {for(OpConstants constant: OpConstants.values()) {System.out.println(constant.toString());}}
}

基本上println()会自动呼叫toString(),所以不写toString()其实也是可以的,执行结果如下:

TURN_LEFT 
TURN_RIGHT 
SHOOT

您可以使用 "==" 或是 equals() 方法来比较列举对象,""==""会比较您提供的列举对象是不是同一个(也就是占据同一个内存位置),而equals()则是实质的比较两个列举对象的内容,预设会根据列举的字符串值来比较。
valueOf()方法可以让您将指定的字符串尝试转换为列举实例,您可以使用compareTo()方法,这可以比较两个列举对象在列举时的顺序,下面举个例子

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {enumCompareTo(OpConstants.valueOf(args[0]));}public static void enumCompareTo(OpConstants constant) {System.out.println(constant);for(OpConstants c: OpConstants.values()) {System.out.println(constant.compareTo(c));}}
}

执行结果:

$java ShowEnum TURN_RIGHT
TURN_RIGHT
1
0
-1

传回正值,表示顺序在被比较的列举对象之前,负值表示之后,而0则表示两个互比列举值的位置是相同的。

对于每一个列举成员,我们可以使用ordinal()方法,依列举顺序得到位置索引,预设以 0 开始,例如:

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {for(OpConstants c : OpConstants.values()) {System.out.printf("%d %s%n", c.ordinal(), c);}}
}

执行结果:

0 TURN_LEFT
1 TURN_RIGHT
2 SHOOT

【没有看完】

转载于:https://www.cnblogs.com/CheeseZH/archive/2012/12/05/2802429.html

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

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

相关文章

驱动提取软件_深入分析施耐德工控软件代码执行漏洞

更多全球网络安全资讯尽在邑安全简介在本文中,我们将为读者详细介绍Claroty Research团队的Amir Preminger和Sharon Brizinov是如何组合利用两个漏洞,来触发施耐德工控软件EcoStruxure Operator Terminal Expert的代码执行漏洞,从而在首届举办…

ubuntu 网卡突然无法连接

今天要用到VM BT的Namp扫描服务器端口,发现桥接后无法使用。ifconfig 只看到 lo地址,看不到以太网网卡地址使用lspci 查看是否安装了以太网网卡驱动lscpi | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LA…

atitit.表单验证 的dsl 本质跟 easyui ligerui比较

atitit.表单验证的dsl 本质跟 easyui ligerui比较 1. DSL 声明验证 1 2. 自定义规则 1 3. 正则表达式验证,可以扩展实现 2 4. 犯错误消息提示,generic canBeEmpty is good 3 5. Prevent the form to submit when invalid 3 6. 为空则不验证,不为空则验证&#xff0…

StartActivityForResult

StartActivity 用startActivityForResult(intent, requestcode);启动子功能模块activity onActivityResult(int requestCode, int resultCode, Intent data)对子activity返回进行判断处理 public class StartActivity extends Activity implements OnClickListener {private Bu…

micropython 串口写文件_MicroPython通过2G模块串口收发短信

集成2G通信、定位模组,赋予物联网特性。本例使用M6220,它是一款基于eSIM技术的2G模组,支持GSM/GPRS,提供GPS北斗双模定位功能,并具备一定的数据处理能力,其2G工作频段有GSM850、GSM900、DCS1800和PCS1900&a…

洛谷P1130 红牌

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂 ,一共包括N个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了M个工作人员来检查材料。不幸的是&#xf…

GPS坐标换算

30.8872 》——>300.8872*60 53.232 ——>530.232*60 13.9230: 53 13.92"30: 53 13.92"》3053/6013.92/360030.887199同经度两点之间距离dla30.887m * [差值/(1/3600)] 30.887m * 差值 *3600 111193.2m * 差值 同纬度两点之间距离dlo30.887m * [差值/(1…

企业级应用框架(五)IOC容器在框架中的应用

前言 在上一篇我大致的介绍了这个系列所涉及到的知识点,在本篇我打算把IOC这一块单独提取出来讲,因为IOC容器在解除框架层与层之间的耦合有着不可磨灭的作用。当然在本系列前面的三篇中我也提供了一种基于反射的解耦方式,但是始终不是很优雅&…

后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇

几个礼拜前,一个学弟问我:“Ray,我打算之后要找工作了,不过现在自己没有特别深入的语言,最近想找一门好好学一下,你觉得学什么语言好呀?”我表示:“这个要看你求职方向、个人喜好、市…

python扫描ip的端口打开情况

我们的韩国bss系统上线之后,要求对主机的端口、资源使用进行统计,端口每个主机去看,太费劲了,所以,就写了这样一个小程序,不是很完美但是,可以用啊!哈哈哈,别喷&#xff…

flash java 通信,Flash到JavaScript的通信实例

从HTML可以发送数据到Flash,反过来也可以. 这个例子演示了如何应用Flash的Fscommand来发送数据到Javascript.简要步骤:Flash中新建一个文件,保存为flash_to_javascript.fla创建一个文本域,设置成输入文本(Input Text),选择"border"以便我们能看到他,指定他的变量为in…

10个非常有用的CSS hack和技术

转自&#xff1a;http://www.qianduan.net/10-useful-css-hacks-and-technique.html 1 – 跨浏览器的inline-block <style>li {width: 200px;min-height: 250px;border: 1px solid #000;display: -moz-inline-stack;display: inline-block;margin: 5px;zoom: 1;*display:…

Java的递归算法

递归算法设计的基本思想是&#xff1a;对于一个复杂的问题&#xff0c;把原问题分解为若干个相对简单类同的子问题&#xff0c;继续下去直到子问题简单到可以直接求解&#xff0c;也就是说到了递推的出口&#xff0c;这样原问题就有递推得解。 关键要抓住的是&#xff1a; &…

python list遍历定位元素_python for循环,第二遍定位不到元素?

ycyzharry: 也不行&#xff0c;我的代码import unittestimport timeimport xlrdfrom selenium import webdriverimport seleniumdef open_excel(filefile.xls):try:data xlrd.open_workbook(file)return dataexcept Exception as e:print(str(e))def excel_table_byindex(file…

发现Java程序中的Bug

昨天在CSDN上阅读 "Java中十个常见的违规编码"这篇文章时&#xff0c;无意中找到了3个 "发现Java程序中的Bug"工具。 文章地址&#xff1a;http://www.csdn.net/article/2012-09-11/2809829-common-code-violations-in-java其中&#xff0c; FindBugs™ - …

原生php登录注册,原生php登陆注册

本以为一个登陆注册功能十来分钟就写好了&#xff0c;没想到thinkPHP用久了&#xff0c;原生的php不会写了最开始我直接写了类和方法&#xff0c;在前台传递参数给类的login方法(action"index.php/login"),尝试几次发现无法访问&#xff0c;这才意识到&#xff0c;这…

SpringMVC REST 风格静态资源访问配置

1 在web.xml中使用默认servlet处理静态资源&#xff0c;缺点是如果静态资源过多&#xff0c;则配置量会比较大&#xff0c;一旦有遗漏&#xff0c;则会造成资源无法正常显示或404错误。 <!-- 静态资源访问控制 --><servlet-mapping><servlet-name>default<…

生成对象

var c[name,age,city]; var d[xiaogang,12,anhui]; var a{}; for(var i0;i<3;i){a[c[i]]d[i]; } console.log(a); //返回 {name: "xiaogang", age: "12", city: "anhui"} 转载于:https://www.cnblogs.com/xiaozhumaopao/p/6046823.html

3.寄存器(内存访问)

CPU中&#xff0c;用16位来存储一个字。高8位存放高位字节&#xff0c;低8位存放低位字节。内存存储中&#xff0c;内存单元是字节单元&#xff08;1单元1字节&#xff09;&#xff0c;则一个字要用两个地址连续的内存单元存放。内存存储中&#xff0c;高位字节&#xff0c;和低…

shiro前后端分离_为什么要前后端分离?前后端分离的优点是什么?

随着互联网的高速发展以及IT开发技术的升级&#xff0c;前后端分离已成为互联网项目开发的业界标准使用方式。在实际工作中&#xff0c;前后端的接口联调对接工作量占HTML5大前端人员日常工作的30%-50%&#xff0c;甚至会更高。接下来千锋小编分享的广州HTML5大前端学习就给大家…