文档章节

浅谈Java中的枚举类型

myyin
 myyin
发布于 2014/09/10 12:20
字数 1620
阅读 51
收藏 0

    如果你只是想运用枚举类型,那么你只需认认真真的听完我的这一顿乱侃估计就差不多了。如果你也是一个刨根问底,并且直接往祖坟上刨的人的话,不妨你看一看我的上一篇博客,想必会对你的刨坟路有所帮助。那我们也不多说了,说点有用的吧,希望对你有帮助。自己感觉,其实美剧类型就是一个特殊的类而已,只不过有一点区别罢了,行,那我们就看看如何定义一个简单的枚举类型。

public enum ColorEnum{
    RED,GREEN,BLUE,YELLOW
}

没猜错,这就是一个简单的枚举类型的定义,其实定义一个枚举类型和定义一个类是一样的,只不过他有一些特殊之处罢了。某种程度上说enum就是class和interface,只不过是编译器帮我们补齐了而已。那我们怎么用呢?

ColorEnum colorRed = ColorEnum.RED; // 方法一
ColorEnum colorBlue = ColorEnum.valueOf("BLUE");// 方法二
ColorEnum colorGreen = (ColorEnum) Enum.valueOf(ColorEnum.class,"GREEN");// 方法三

其实通过关键字定义的就是一个类,而这些类都是类库中Enum类的子类(java.lang.Enum)。它们继承了这个Enum中的许多有用的方法。我们对代码编译之后发现,编译器将enum类型单独编译成了一个字节码文件:Color.class。

final enum hr.test.Color {  
// 所有的枚举值都是类静态常量  
public static final enum hr.test.Color RED;   
public static final enum hr.test.Color GREEN;
public static final enum hr.test.Color BLUE;   
public static final enum hr.test.Color YELLOW;   
private static final synthetic hr.test.Color[] ENUM$VALUES;  
// 初始化过程,对枚举类的所有枚举值对象进行第一次初始化  
static {  
0 new hr.test.Color [1]  
3 dup  
4 ldc [16] //把枚举值字符串“RED”压入操作数栈  
6 iconst_0 // 把整型值0压入操作数栈  
7 invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED  
10 putstatic hr.test.Color.RED : hr.test.Color [21] //将枚举对象赋给Color的静态常量RED。  
。..。..。.. 枚举对象BLUE等与上同  
102 return 
};  
// 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。  
private Color(java.lang.String arg0, int arg1){  
// 调用父类Enum的受保护构造器创建一个枚举对象  
3 invokespecial java.lang.Enum(java.lang.String, int) [38]  
};  
public static hr.test.Color[] values();  
// 实现Enum类的抽象方法  
public static hr.test.Color valueOf(java.lang.String arg0);  
}

(以上的代码是参考至:http://developer.51cto.com/art/201107/275031.htm),从编译后的文件可以看出,那些枚举值也同样是被 static final 来修饰的。这就是说明我们上一篇说的还是有那么点道理的啊!最起码没有大的错误吧!Java中规定是不能够多继承的,既然是这样,如果我们还有什么业务的需求的话,可以通过实现接口来实现。既然上面说我们用关键字enum定义的“类”是继承至java.lang.Enum,那么想必会继承到他的很多方法。接下来我们就对那些有用的方法及知识点做一个简单的介绍。

1. 首先想说的是,被enum关键字定义的类,是不可以被继承的。但是既然说它是类,那么它就可以有自己的构造方法和属性及普通的方法。当然既然焦作枚举类型,那么他就有他的特殊之处了,想知道有哪些特殊之处,那你就听我给你娓娓道来。

enum Color{  
RED(255,0,0),GREEN(0,255,0),BLUE(0,0,255),YELLOW(255,255,0);  
//构造枚举值,比如RED(255,0,0)  
private Color(int rv,int gv,int bv){  
this.redValue=rv;  
this.greenValue=gv;  
this.blueValue=bv;  
}  
public String toString(){ //覆盖了父类Enum的toString()  
return super.toString()+“(”+redValue+“,”+greenValue+“,”+blueValue+“)”;  
}  
private int redValue; //自定义数据域,private为了封装。  
private int greenValue;  
private int blueValue;  
}

(以上的代码是参考至:http://developer.51cto.com/art/201107/275031.htm我们的构造方法是私有的,而且是必须私有的,只有这样才能够防止外部调用构造方法。但是枚举类的其他属性和方法可根据个人意愿来设定是私有的还是共有的。

2. 我们在对我们所定义的枚举类从它老祖宗那继承来的方法做一个简单的说明

(1) ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。

Color.RED.ordinal(); //返回结果:0  
Color.BLUE.ordinal(); //返回结果:2

(2) compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出异常

Color.RED.compareTo(Color.BLUE); //返回结果 -2

(3) values()方法: 静态方法,返回一个包含全部枚举值的数组。

Color[] colors=Color.values();  
for(Color c:colors){  
System.out.print(c+“,”);  
}//返回结果:RED,GREEN,BLUE,YELLOW,

(4) toString()方法: 返回枚举常量的名称。

Color c=Color.RED;  
System.out.println(c);//返回结果: RED

(5) valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。

Color.valueOf(“BLUE”); //返回结果: Color.BLUE

(6) equals()方法: 比较两个枚举类对象的引用。

//JDK源代码:  
public final boolean equals(Object other) {  
return this==other;  
}

就给你扯到这了,当然枚举类型还可以在switch中运用。我估计看完这些,及时你不知道什么原理,也能够满足你在日常工作中的运用了吧。还是那句诚恳的话,小白我初来乍到,说的有什么不对的,请大神在喷的同时,檫掉您那长长的哈喇子,把你知道,我错了的指出来。写出这些东西,一是希望能够对自己头脑中的知识点进行一个梳理,这样不仅能够有助于理解,还且还有助于记忆。二是希望能够使自己的生活充实起来,当未来的某个时候再打开博客时,有资格语重心长的说一句,哈哈,想当年也是乱侃了那么多,忽悠了那么多的。三是希望自己能够写出来来帮助像曾经的我的那些人,让他们少走一些弯路,把有限的时间用在有用的事上,而不是在那不停的敲百度,点鼠标。



© 著作权归作者所有

myyin
粉丝 0
博文 6
码字总数 5856
作品 0
朝阳
私信 提问
Java中枚举的线程安全性及序列化问题

来源:微信公众号 ,原创: Hollis --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字...

Java填坑之路
2018/08/02
0
0
浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型、基本语法、代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言:   今日新闻:谷歌宣布,将Kotli...

听着music睡
2017/05/18
0
0
java 枚举(enum) 全面解读

简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类....

jimmie_yang
2018/10/19
0
0
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
2018/07/18
114
0
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

2018/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部