java基础-enum 枚举

news/2024/5/18 5:22:58 标签: java, 枚举, enum

Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。枚举类型的定义也非常的简单,用 enum 关键字加上名称和大括号包含起来的枚举值体即可,例如上面提到的彩虹颜色就可以用新的 enum 方式来重新定义:

enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

从上面的定义形式来看,似乎 Java 中的枚举类型很简单,但实际上 Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。

enum扩大了 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、long、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:

复制代码
// 定义一周七天的枚举类型                          
 public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } 
 
 // 读取当天的信息
 WeekDayEnum today = readToday(); 
 
 // 根据日期来选择进行活动
 switch(today) { 
  Mon: do something; break; 
  Tue: do something; break; 
  Wed: do something; break; 
  Thu: do something; break; 
  Fri: do something; break; 
  Sat: play sports game; break; 
  Sun: have a rest; break; 
 }
复制代码

 


对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch 语句就根据此来进行执行跳转。

除了最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性、添加构造方法或抽象方法,

复制代码
package heima;

 

public class EnumTest {

        public static void main(String[] args) {

              TrafficLamp ww = TrafficLamp.RED;

              System.out.println(ww);//枚举自动实现了toString方法

              System.out.println(ww.time);//红灯时长

              System.out.println(ww.nextLamp());//下一个等的颜色

 

       }

      

public enum TrafficLamp {//枚举也是一个类,可以有子类,也有默认构造方法

      

       RED(30){// 调用父类的有参的构造方法创建一个子类的实例,由匿名内部类创建子类,,并构建新的方法

              public TrafficLamp nextLamp() {//重写父类的抽象方法,

                     return GREEN;

              };

               

       },

       GREEN(30){

              public TrafficLamp nextLamp() {

                     return YELLOW;

              };

               

             

       }, YELLOW(5){

              public TrafficLamp nextLamp() {

                     return RED;

              };

               

             

       };

       private int time;

       private TrafficLamp(int time){//定义有参的构造方法,增加参数时间

              this.time= time;

       }

      

       public abstract TrafficLamp nextLamp() ;

 

             

       }

 

}
复制代码

 

 

 

不过在使用 Enum 时候有几个地方需要注意:

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

http://www.niftyadmin.cn/n/1678410.html

相关文章

ubuntu openstack spice

ubuntu openstack spice Openstack启用spice协议 #控制节点 #安装 ?1apt-get install nova-spiceproxy spice-html5 spice-vdagent#配置 nano /etc/nova/nova.conf ?123456789# Vnc configuration#vnc_enabledfalse[spice]enabledtruehtml5proxy_base_urlhttp://192.168.29.8…

自定义mvc简单学习(一)

自定义mvc简单学习(一) 自定义mvc简单学习(一) mvc简单学习目录自定义mvc简单学习(一)一、环境搭建二、集合框架1、List2、Set3、Map三、xml学习1、主要的作用数据交互以及做配置2、DTD约束介绍DTD3、XML解析介绍XML解析4、XML建模介绍XML建模四、反射1、为什么使用反射&#…

8ytrtf6

eyherh [url]http://hiphotos.baidu.com/zangyu7609/pic/item/3c219e3f08d56ff455e72370.jpg[/url]转载于:https://blog.51cto.com/huxiaoxue/106551

常用SVN命令

SVN命令 svn co svn://10.144.156.41/branches/webroot_2015_03_03_gift表示check远程目录到当前目录下,co命令只能check目录,如果要check文件,需要使用svn export命令,export如果检出文件夹的话,文件夹就只是本地文件…

综述ASP.NET下的AJAX模式

本文内容:一、导言二、XMLHttpWebForm模式三、XMLHttpHttpHandler模式四、ASP.NET 2.0/3.5回调模式五、AJAX框架模式----------------------------------------------------------------------------------------------------------一、导言 在这篇文章中,将介绍…

Eclipse4.5Mars安装JAD反编译插件

2019独角兽企业重金招聘Python工程师标准>>> 声明:在您阅读本文之前,希望您能了解的事。本文中的JAD站点URL已经失效,而我也选择了替代插件Eclipse Class Decomplier2.9.0(Eclipse Version 4.6-Neon-64bit). 下面是新的插件安装过…

.NET MVC 遇到的小问题

本人较土&#xff0c;前日开园&#xff0c;随献开园礼&#xff0c;望不要嘲笑&#xff61;◕‿◕&#xff61;在呈现View时&#xff0c;用到了TextBox 方法 (HtmlHelper, String, Object, Object)&#xff0c;第三个重载。 应用如下&#xff1a; <% Html.TextBox("ID&q…

Android基础-数据库SQLite

一、创建数据库 安卓中使用的数据库是&#xff1a;SQLite&#xff08;轻量级&#xff0c;嵌入式的数据库&#xff09;创建文件时&#xff1a;1.声明文件对象&#xff0c;文件是不会被创建出来的。File file new File("文件名称");2.写文件&#xff08;文件才会被创建…