java中的枚举类型枚举问题

2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
2012年1月 移动平台大版内专家分月排行榜第三
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人QQ群:、
个人大数据技术博客:http://www.iteblog.com
分析枚举的线程安全性及序列化问题Java的枚举类型使用方法详解
转载 & & 作者:奋斗在路上
这篇文章主要介绍了Java的枚举类型使用方法详解,从背景、到定义、特点、使用方式做个简单了解,感兴趣的小伙伴们可以参考一下
在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。
public class Season {
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;
这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么久了,应该没问题的。通常我们写出来的代码都会考虑它的安全性、易用性和可读性。 首先我们来考虑一下它的类型安全性。当然这种模式不是类型安全的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但是使用int类型,我们无法保证传入的值为合法。代码如下所示:
private String getChineseSeason(int season){
StringBuffer result = new StringBuffer();
switch(season){
case Season.SPRING :
result.append("春天");
case Season.SUMMER :
result.append("夏天");
case Season.AUTUMN :
result.append("秋天");
case Season.WINTER :
result.append("冬天");
result.append("地球没有的季节");
return result.toString();
public void doSomething(){
System.out.println(this.getChineseSeason(Season.SPRING));//这是正常的场景
System.out.println(this.getChineseSeason(5));//这个却是不正常的场景,这就导致了类型不安全问题
程序getChineseSeason(Season.SPRING)是我们预期的使用方法。可getChineseSeason(5)显然就不是了,而且编译很通过,在运行时会出现什么情况,我们就不得而知了。这显然就不符合Java程序的类型安全。
接下来我们来考虑一下这种模式的可读性。使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。 从类型安全性和程序可读性两方面考虑,int和String枚举模式的缺点就显露出来了。幸运的是,从Java1.5发行版本开始,就提出了另一种可以替代的解决方案,可以避免int和String枚举模式的缺点,并提供了许多额外的好处。那就是枚举类型(enum type)。接下来的章节将介绍枚举类型的定义、特征、应用场景和优缺点。
枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。
public enum Season {
SPRING, SUMMER, AUTUMN, WINER;
Java定义枚举类型的语句很简约。它有以下特点:
1) 使用关键字enum 2) 类型名称,比如这里的Season 3) 一串允许的值,比如上面定义的春夏秋冬四季 4) 枚举可以单独定义在一个文件中,也可以嵌在其它Java类中。
除了这样的基本要求外,用户还有一些其他选择
5) 枚举可以实现一个或多个接口(Interface) 6) 可以定义新的变量 7) 可以定义新的方法 8) 可以定义根据具体枚举值而相异的类
4.应用场景
以在背景中提到的类型安全为例,用枚举类型重写那段代码。代码如下:
public enum Season {
SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);
private Season(int code){
this.code =
public int getCode(){
public class UseSeason {
* 将英文的季节转换成中文季节
* @param season
public String getChineseSeason(Season season){
StringBuffer result = new StringBuffer();
switch(season){
case SPRING :
result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
case AUTUMN :
result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
case SUMMER :
result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
case WINTER :
result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
result.append("地球没有的季节 " + season.name());
return result.toString();
public void doSomething(){
for(Season s : Season.values()){
System.out.println(getChineseSeason(s));//这是正常的场景
//System.out.println(getChineseSeason(5));
//此处已经是编译不通过了,这就保证了类型安全
public static void main(String[] arg){
UseSeason useSeason = new UseSeason();
useSeason.doSomething();
[中文:春天,枚举常量:SPRING,数据:1] [中文:夏天,枚举常量:SUMMER,数据:2] [中文:秋天,枚举常量:AUTUMN,数据:3] [中文:冬天,枚举常量:WINTER,数据:4]
这里有一个问题,为什么我要将域添加到枚举类型中呢?目的是想将数据与它的常量关联起来。如1代表春天,2代表夏天。
那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。Java 1.5的枚举能满足绝大部分程序员的要求的,它的简明,易用的特点是很突出的。
用法一:常量
public enum Color {
RED, GREEN, BLANK, YELLOW
用法二:switch
enum Signal {
GREEN, YELLOW, RED
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
color = Signal.GREEN;
case YELLOW:
color = Signal.RED;
case GREEN:
color = Signal.YELLOW;
用法三:向枚举中添加新方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
// get set 方法
public String getName() {
public void setName(String name) {
this.name =
public int getIndex() {
public void setIndex(int index) {
this.index =
用法四:覆盖枚举的方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
//覆盖方法
public String toString() {
return this.index+"_"+this.
用法五:实现接口
public interface Behaviour {
void print();
String getInfo();
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
//接口方法
public String getInfo() {
return this.
//接口方法
public void print() {
System.out.println(this.index+":"+this.name);
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
enum Dessert implements Food{
FRUIT, CAKE, GELATO
以上就是本文的全部内容,希望对大家的学习有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具java中枚举(enum)常见的7种用法 - 简书
java中枚举(enum)常见的7种用法
在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口,对于大部分面向对象编程,有这两种似乎就足够了,但是在一些特殊情况就不合适。例如:想要定义一个Color类,它只能有Red,Green,Blue三种,其他值则是错误,在JDK1.5之后便引入枚举类型。
用法一:常量
在JDK1.5 之前,我们定义常量都是: public static fianl…. ,枚举可以将相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Color {
RED, GREEN, BLANK, YELLOW
Color c = Color.BLUE ;
// 取出蓝色
System.out.println(c) ;
用法二:switch
JDK1.5起switch语句支持Enum枚举值,使用枚举,能让我们的代码可读性更强。
public class SwitchEnum {
Color color = Color.RED;
public void change() {
switch (color) {
color = Color.GREEN;
case YELLOW:
color = Color.RED;
case GREEN:
color = Color.YELLOW;
用法三:向枚举中添加新方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
// get set 方法
public String getName() {
public void setName(String name) {
this.name =
public int getIndex() {
public void setIndex(int index) {
this.index =
用法四:覆盖枚举的方法
下面给出一个toString()方法覆盖的例子。
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
//覆盖方法
,可自定义返回
public String toString() {
return this.index+"_"+this.
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {
void print();
String getInfo();
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
// 构造方法
private Color(String name, int index) {
this.name =
this.index =
//接口方法
public String getInfo() {
return this.
//接口方法
public void print() {
System.out.println(this.index+":"+this.name);
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
enum Dessert implements Food{
FRUIT, CAKE, GELATO
用法七:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。
使用EnumMap
import java.util.EnumM
import java.util.M
enum Color{
RED , GREEN , BLUE ;
public class EnumMapDemo{
public static void main(String args[]){
Map&Color,String& desc =
// 定义Map对象,同时指定类型
desc = new EnumMap&Color,String&(Color.class) ;
// 实例化EnumMap对象
desc.put(Color.RED,"红色") ;
desc.put(Color.GREEN,"绿色") ;
desc.put(Color.BLUE,"蓝色") ;
System.out.println("====== 输出全部的内容 ======") ;
for(Color c:Color.values()){
System.out.println(c.name() + " --& " + desc.get(c)) ;
System.out.println("====== 输出全部的键值 ======") ;
for(Color c:desc.keySet()){
System.out.print(c.name() + "、") ;
System.out.println() ;
System.out.println("====== 输出全部的内容 ======") ;
for(String s:desc.values()){
System.out.print(s + "、") ;
使用 EnumSet
import java.util.EnumS
enum Color{
RED , GREEN , BLUE ;
public class EnumSetDemo{
public static void main(String args[]){
EnumSet&Color& esOld =
// 声明一个EnumSet对象
EnumSet&Color& esNew =
System.out.println("======== EnumSet.copyOf(Color.class) =====") ;
esOld = EnumSet.noneOf(Color.class) ;
// 将枚举的全部类型设置到EnumSet对象之中
esOld.add(Color.RED) ;
// 增加内容
esOld.add(Color.GREEN) ;
// 增加内容
esNew = EnumSet.copyOf(esOld) ;
// 从已有的集合拷贝过来
print(esNew) ;
public static void print(EnumSet&Color& temp){
// 专门的输出操作
for(Color c:temp){
循环输出EnumSet中的内容
System.out.print(c + "、") ;
System.out.println() ;
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java.base.jmod|wc -l5761 classes/module-info.classclasses/appl...
一 Java 枚举7常见种用法DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分...
本文包括:枚举由来如何使用?枚举类特性单例设计模式定义特殊结构枚举星期输出中文的案例枚举类API 枚举(enum) 1、枚举由来 定义一个仅容许特定数据类型值的有限集合。 例如,你可能需要一个称为“等级”,且仅可被赋值为“A”,“B”,“C”,“F”等值的类型,任何其他值在...
01 他就是个骗子! 她咬牙切齿地想,觉得自己恍然大悟,为时未晚,应该值得庆幸,可偏偏有种难以名状的失落感涌上心头,仿佛被一根鱼刺卡住喉咙,干咳出几滴眼泪,于事无补。 她承认,那次和他的水乳交融,他的宽敞的温暖的有力的怀抱,他的性感的多情的灵活的嘴唇,他的细细的碎齐的胡渣子...
十一转瞬即逝,拖着疲惫的身体,又开始了累成狗的工作,相比节前,你可能更累了,因为节前拖着的很多活,终于还是不能再拖了,面对现实的生活顿感无爱,简直生无可恋。 网络神曲《感觉身体被掏空》神一般的说出了许多人的心声: 感觉身体被掏空,生活过的太沉重好想今夜去放纵,可是还得继续奋...
在网上看到一句话,什么是孤独? 有人回答说,我爱你,这便是孤独。 而现世里,这般孤独之美,欣赏者少之又少, 就好像,人生于天地之间,却自觉如远行之客一般,实为寄也。你在某一刻,或者是某个生死时段间爱上了一个人,恍惚天地之间,混沌后万清,终茕茕孑立。在小我中迸发出一种大美的道...
写作原因:Java反射注解这一块一直是笔者的盲区,但是Java系开发者都知道这一块的重要性。以熟悉的Android开发为例,通过利用反射注解大神们创造了可以减少大量重复赘余代码和清晰逻辑结构的依赖注入框架。本文也是为日后的依赖注入剖析做预备。由于水平限制,一些地方可能存在疏...
她叫李沐。介绍完自己后,我回到座位上,在语文书上慢而有力的写下了她的名字。接下来的一个小时内,我的脑子是真空的,班主任浑厚有力的嗓子有条不紊地讲着校规校纪,其他同学窃窃私语不停,似乎只有我一个人,发呆着,若有所思着,却什么也没想,撑着头,目光落在前桌背上,直到同桌推了我一下...将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;
枚举基本特性
以下代码是枚举的简单使用:
使用values方法返回enum实例的数组
使用ordinal方法返回每个enum实例的次序,从0开始
使用compareTo方法比较两个enum实例
使用==来比较enum实例
使用getDeclaringClass方法返回enum实例所属的enum类
使用valueOf方法根据指定的名字返回enum实例
enum Shrubbery {
GROUND, CRAWLING, HANGING
public class EnumClass {
public static void main(String[] args) {
for (Shrubbery s : Shrubbery.values()) {
System.out.println(s + " ordinal: " + s.ordinal());
System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");
System.out.println(s.equals(Shrubbery.CRAWLING) + " ");
System.out.println(s == Shrubbery.CRAWLING);
System.out.println(s.getDeclaringClass());
System.out.println(s.name());
System.out.println("----------------------");
// Produce an enum value from a string name:
for (String s : "HANGING CRAWLING GROUND".split(" ")) {
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
注意枚举enum默认是继承自java.lang.Enum类的,在以上代码中,Shrubber为一个枚举类, GROUND, CRAWLING, HANGING为这个enum类的实例,由于Shrubber已经继承自java.lang.Enum类,所以它是不能在继承其它enum类的;
另外,在使用枚举的时候,可以考虑使用静态导入枚举类型,省去使用枚举类型修饰枚举实例;
向enum中添加方法
enum基本上是可以被看做一个常规的类,可以向其添加方法,甚至main方法;
如下代码,在枚举类内部添加一个构造方法和getDescription方法, 注意,当定义自己方法的时候,需要在enum实例序列的最后一个后面添加分号,且要先定义enum实例再定义方法;
public enum OzWitch {
// Instances must be defined first, before methods:
WEST("Miss Gulch, aka the Wicked Witch of the West"),
NORTH("Glinda, the Good Witch of the North"),
EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"),
SOUTH("Good by inference, but missing");
// Constructor must be package or private access:
private OzWitch(String description) {
this.description =
public String getDescription() {
public static void main(String[] args) {
for (OzWitch witch : OzWitch.values())
System.out.println(witch + ": " + witch.getDescription());
再看一个例子,覆盖Enum类的方法,如下代码,覆盖toString方法,将枚举的name首字母大写,其余转为小写,:
public enum SpaceShip {
SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
public String toString() {
String id = name();
String lower = id.substring(1).toLowerCase();
return id.charAt(0) +
public static void main(String[] args) {
for (SpaceShip s : values()) {
System.out.println(s);
在switch中使用枚举
如下代码是枚举在switch语句中的使用,注意在case语句里,枚举实例前面是不需要写上枚举类型的,强行写上(如Signal.RED)编译器会报错;
// Define an enum type:
enum Signal {
GREEN, YELLOW, RED,
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
// Note that you don't have to say Signal.RED
// in the case statement:
color = Signal.GREEN;
case GREEN:
color = Signal.YELLOW;
case YELLOW:
color = Signal.RED;
public String toString() {
return "The traffic light is " +
public static void main(String[] args) {
TrafficLight t = new TrafficLight();
for (int i = 0; i & 7; i++) {
System.out.println(t);
t.change();
关于枚举中的values()方法
我们已经知道枚举类是继承java.lang.Enum类的,但是查看Enum源代码却没有发现有values()方法,那么values()方法是哪里来的呢?
答案是,values()方法是由编译器添加的静态方法,有兴趣可以利用反射机制去查看,如上面的例子,可以编写如下代码查看:
Method[] methods = Signal.class.getMethods();
看一个例子就好,如下:
基本可以把枚举当成一个类来使用;
//Color继承自Enum
public enum Color {
//Color实例
RED("Red"),
YELLOW("Yellow"),
//Color实例,继承自Color
BLUE("Blue") {
public String getDescription() {
//调用父类的test方法,BLUE实例是继承自Color的
super.test();
return super.getDescription();
//重写父类Color的toString方法
public String toString() {
return "蓝色";
private Color(String description) {
this.description =
public String getDescription() {
//重写父类Enum的toString方法
public String toString() {
return this.
public void test() {
System.out.println("hi~");
public static void main(String[] args) {
//调用Color.BLUE实例的getDescription方法
Color.BLUE.getDescription();
//Color.RED是Color的一个实例,Color继承自Enum
Enum&Color& red = Color.RED;
System.out.println(red);//调用Color的toString
//调用Color.BLUE的toString
System.out.println(Color.BLUE);
参考资料:JAVA编程思想--4
阅读(...) 评论()

我要回帖

更多关于 java中枚举 的文章

 

随机推荐