Java枚举类型的使用.docx
- 文档编号:30664157
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:10
- 大小:17.09KB
Java枚举类型的使用.docx
《Java枚举类型的使用.docx》由会员分享,可在线阅读,更多相关《Java枚举类型的使用.docx(10页珍藏版)》请在冰豆网上搜索。
Java枚举类型的使用
Java枚举类型的使用
问题:
Java枚举类型的使用回答:
1.在J2SE5.0中要定义枚举类型是使用enum关键词,枚举类型主要提供一些常数。
如下列代码定义了Action枚举类型:
Java代码
publicenumAction
{
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
在Action.java中编写此段代码并编译,虽然语法上不像是在定义类,但枚举类型本质上就是一个类。
所以编译完成后,会产生一个Action.class文件。
下面的代码是说明如何使用定义好的枚举类型一个示例:
Java代码
publicclassEnumDemo
{
publicstaticvoidmain(String[]args)
{
doAction(Action.TURN_RIGHT);
}
publicstaticvoiddoAction(Actionaction)
{
switch(action)
{
caseTURN_LEFT:
System.out.println("向左转");
break;
caseTURN_RIGHT:
System.out.println("向右转");
break;
caseSHOOT:
System.out.println("射击");
break;
}
}
}
运行结果:
向右转。
其中doAction()方法所接受的变量必须是Action枚举类型,如果对此方法输入其他类型的变量,编译器会报告错误。
另外,如果在上面的switch中加入了不属于Action中枚sEnumDemo2
{
privateenumInnerAction{TURN_LEFT,TURN_RIGHT,SHOOT};
publicstaticvoidmain(String[]args)
{
doAction(InnerAction.TURN_RIGHT);
}
publicstaticvoiddoAction(InnerActionaction)
{
switch(action)
{
caseTURN_LEFT:
System.out.println("向左转");
break;
caseTURN_RIGHT:
System.out.println("向右转");
break;
caseSHOOT:
System.out.println("射击");
break;
}
}
}
由于枚举类型本质上还是类,所以这段代码中枚举声明方式有些像在声明内嵌类。
在编译完EnumDemo2.java后,会有一些额外的.class文件产生,在此例中就是EnumDemo2$InnerAction.class与EnumDemo2$1.class。
看到这两个文件,就可以知道实际上编译器产生了成员内部类和匿名内部类。
上面通过枚举类型设定常数的方式比旧版本的常数设定方式多了编译时期类型检查的好处。
以下将深入讨论枚举类型的一些知识,以便深入理解。
2.深入枚举类型:
定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。
而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。
无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。
可以通过类名称直接使用它们。
如1中所定义的枚举类型Action,TURN_LEFT,TURN_RIGHT,SHOOT都是Action的一个对象实例。
因为是对象,所以,对象上自然有一些方法可以调用。
如从Object继承焉的toString()方法被重新定义了,可以让你直接取得枚举值的字符串描述;values()方法可以让您取得所有的枚举成员实例,并以数组方式返回。
您可以使用这两个方法来简单的将Action的枚举成员显示出来。
静态valueOf()方法可以让您将指定的字符串尝试转换为枚举类型。
可以用compareTo()方法来比较两个枚举对象在枚举时的顺序。
-1之前,0位置相同,1之后。
对于每个枚举成员,使用ordinal()方法,依枚举顺序得到位置索引,默认以0开始。
3.枚举上的方法:
定义枚举类型基本上就是在定义类,定义枚举类型时也可以定义方法。
如可以为枚举加上一些描述,而不是使用默认的toString()返回值来描述枚举值。
如下代码所示:
Java代码
publicenumDetailAction
{
TURN_LEFT,TURN_RIGHT,SHOOT;
publicStringgetDescription()
{
switch(this.ordinal())
{
case0:
return"向左转";
case1:
return"向右转";
case2:
return"射击";
default:
returnnull;
}
}
}
可以用下面的代码测试所定义的方法是否可用。
Java代码
publicclassDetailActionDemo
{
publicstaticvoidmain(String[]args)
{
for(DetailActionaction:
DetailAction.values())
{
System.out.printf("%s:
%s%n",action,action.getDescription());
}
}
}
运行结果:
TURN_LEFT:
向左转
TURN_RIGHT:
向右转
SHOOT:
射击
4.枚举类型既然是类,那么也就可以有构造函数。
只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化。
如下代码:
Java代码
enumDetailActioin2
{
TURN_LEFT("向左转"),TURN_RIGHT("向右转"),SHOOT("射击");
privateStringdescription;
//不公开的构造函数
privateDetailActioin2(Stringdescription)
{
this.description=description;
}
publicStringgetDescription()
{
returndescription;
}
}
非公开的构造函数最常见的一个例子就是singleton模式的应用,当某个类只能有一个实例时,可由类维护唯一的实例,这时可以将构造函数设定为私有,取用此类的开发人员就不能自行新增多个实例了。
Singleton模式的简易版本代码如下:
Java代码
publicclassSingleton
{
//构造函数私有,只限内部调用
privateSingleTon(){};
privatestaticSingletoninstance=null;
publicstaticsynchronizedSingleTongetInstance()
{
if(instance==null)
instance=newSingleton();
returninstance;
}
}
4.因值而异的类实现(Value-SpecificClassBodies)
这个功能简单地说像是在使用匿名内部类来实现Command模式,它可以为每个枚举值定义各自的类本体与方法实现。
一种实现方式如下:
Java代码
publicinterfaceIDescription
{
publicStringgetDescription();
}
publicenumMoreActionimplementsIDescription
{
TURN_LEFT
{
//实现接口上的方法
publicStringgetString(){return"向左转"}
},//注意这里的枚举值分隔使用,
TURN_RIGHT
{
//实现接口上的方法
publicStringgetString(){return"向右转"}
},//注意这里的枚举值分隔使用,
SHOOT
{
//实现接口上的方法
publicStringgetString(){return"射击"}
};//注意这里的枚举值结束使用;
}
每个枚举成员的{与}之间是类本体,还可以在其中如同定义类一样地声明数据成员或者数据方法。
测试这段代码的程序如下:
Java代码
publicclassMoreActionDemo
{
publicstaticvoidmain(String[]args)
{
for(MoreActionaction:
MoreAction.values())
{
System.out.printf("%s:
%s%n",action,action.getDescription());
}
}
}
这个例子是将因值而异的类实现用在返回枚举值的描述上,可以按照相同的方式,为每个枚举值加上一些各自的方法实现,而调用的接口是统一的。
执行结果如下:
D:
\Java_Test>javacIDescription.java
D:
\Java_Test>javacMoreAction.java
D:
\Java_Test>javacMoreActionDemo.java
D:
\Java_Test>javaMoreActionDemo
TURN_LEFT:
向左转
TURN_RIGHT:
向右转
SHOOT:
射击
可能是利用枚举类型实现的接口中的方法,这里直接用
D:
\Java_Test>javacIDescription.java编译时会提示找不到getDescription()方法,所以,只好挨个来编译了。
也可以运用抽象方法去改写上面的MoreAction.java,如下:
Java代码
publicenumMoreAction2
{
TURN_LEFT{
//实现抽象方法
publicStringgetDescription()
{
return"向左转";
}
},//记得这里的枚举值分隔使用,
TURN_RIGHT{
//实现抽象方法
publicStringgetDescription()
{
return"向右转";
}
},
SHOOT{
//实现抽象方法
publicStringgetDescription()
{
return"射击";
}
};//记得这里的枚举值结束使用;
//声明抽象方法
publicabstractStringgetDescription();
}
执行结果与上面相同。
分享给朋友:
下一篇:
Java中的Set,List,Map的区别
上一篇:
java通过反射调用方法的两个例子
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 枚举 类型 使用