Java中枚举类的定义以及使用
2013-10-17 23:10
267 查看
看到这个标题,很多人不禁要问---什么是枚举类而且为什么用枚举类呢?那是因为,一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
举个简单的例子,我们每个人都有性别,分为“男”和“女”两种,为了限定这两种情况我们就必须限定这两种情况。下面就请大家看看怎样几种手动的实现枚举的方法:
Person类:
//手动实现枚举
publicclassPerson{
privateStringsex;
//利用正则表达式来限制
publicvoidsetSex(Stringsex){
if(sex.matches("[男女]")){
System.out.println("此性别可以识别!");
}else{
System.out.println("此性别不可识别!");
//thrownewRuntimeException("此性别不可识别!");
}
}
publicStringtoString(){
return"Person[sex="+sex+"]";
}
}
测试类:
importdomain.Person;
publicclassPersonTest{
publicstaticvoidmain(String[]args){
Personp=newPerson();
p.setSex("人妖");
System.out.println(p.toString());
}
}
输出效果:
手动实现枚举类:
通过private
将构造器隐藏起来
把这个类的所有可能实例都使用publicstaticfinal
修饰
属性不应允许被改动,
所以应该使用privatefinal
修饰
Sex类:
publicclassSex{
//性别男
publicstaticfinalSexm=newSex("男");
//性别女
publicstaticfinalSexf=newSex("女");
privatefinalStringvalue;
privateSex(Stringvalue){
this.value=value;
}
//让外界访问所定义的性别
publicStringgetValue(){
returnvalue;
}
}
测试类:
publicclassSex{
//性别男
publicstaticfinalSexm=newSex("男");
//性别女
publicstaticfinalSexf=newSex("女");
privatefinalStringvalue;
privateSex(Stringvalue){
this.value=value;
}
//让外界访问所定义的性别
publicStringgetValue(){
returnvalue;
}
}
输出效果:
看完上面的代码,我们不难发现,上面写法比较麻烦,而java中提供了一种更方便的方法----枚举类可以解决上面的问题
JDK1.5新增的enum关键字用于定义枚举类
枚举类也是一种特殊形式的Java类。
枚举类和普通类的区别:
使用enum定义的枚举类默认继承了
java.lang.Enum类
枚举类的构造器只能使用private
访问控制符
枚举类的所有实例必须在枚举类中显式列出(,
分隔;结尾).
列出的实例系统会自动添加publicstaticfinal
修饰
枚举类的属性:
枚举类对象的属性不应允许被改动,
所以应该使用privatefinal
修饰
枚举类的使用privatefinal
修饰的属性应该在构造器中为其赋值
若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
那么该如何定义呢?
枚举类定义:
/**
*枚举类
*
*@authorLiZhuo
*我们需要注意三点(关于枚举类的属性)
*/
publicenumSexEnume{
//系统为这两个对象默认的加上了publicstaticfinal
M("男"),F("女");
//1.枚举类对象的属性不应允许被改动,所以应该使用privatefinal修饰
privatefinalStringvalue;
//构造器
//2.枚举类的使用privatefinal修饰的属性因该在构造器中为其赋值
privateSexEnume(Stringvalue){
this.value=value;
}
publicStringgetValue(){
returnvalue;
}
//3.若枚举类显示的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
}
同时,枚举类有三种形式(分别为:没有参数的构造方法,带参数的构造方法,使用内部类)。在这里,给大家分享后两种形式的枚举类。
1.带参数的构造方法,功能(性别的获取)
枚举类:
/**
*枚举类
*
*@authorLiZhuo
*我们需要注意三点(关于枚举类的属性)
*/
publicenumSexEnume{
//系统为这两个对象默认的加上了publicstaticfinal
M("男"),F("女");
//1.枚举类对象的属性不应允许被改动,所以应该使用privatefinal修饰
privatefinalStringvalue;
//构造器
//2.枚举类的使用privatefinal修饰的属性因该在构造器中为其赋值
privateSexEnume(Stringvalue){
this.value=value;
}
publicStringgetValue(){
returnvalue;
}
//3.若枚举类显示的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
}
测试类:
publicclassEnumTest{
@Test
publicvoidtest(){
/**
*<form>
*<selectname="sex">
*<optionvalue="M">男</option>
*<optionvalue="F">女</option>
*</select>
*</form>
*/
//枚举类.valueOf("枚举类对象名称");
SexEnumesexEnume=SexEnume.valueOf("F");//返回制定的枚举类对象
System.out.println(sexEnume.getValue());//通过枚举类中的get方法获得制定的值
//ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
System.out.println("性别男所在位置:"+sexEnume.ordinal());
//values()此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
SexEnumesexs[]=SexEnume.values();
//遍历
for(SexEnumesex:sexs){
System.out.println("------"+sex.getValue());
}
/**
*因为会关联到一些特定的值,所以需要用枚举来进行匹配
*/
}
}
显示效果:
2.使用内部类的枚举类,功能():
枚举类:
//使用内部类来实现
/**
*练习:请编写一个关于星期几的枚举WeekDay,要求:枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun
*该枚举要有一个方法,调用该方法返回中文格式的星期。
*/
//,Tue,Wed,Thu,Fri,Sat,Sun
publicenumWeekDayEnum{
Mon("星期一"){
@Override
publicStringtoLocalWeekDay(){
return"星期一";
}
},
Tue("星期二"){
@Override
publicStringtoLocalWeekDay(){
return"星期二";
}
},
Wed("星期三"){
@Override
publicStringtoLocalWeekDay(){
return"星期三";
}
},
Thu("星期四"){
@Override
publicStringtoLocalWeekDay(){
return"星期四";
}
},
Fri("星期五"){
@Override
publicStringtoLocalWeekDay(){
return"星期五";
}
},
Sat("星期六"){
@Override
publicStringtoLocalWeekDay(){
return"星期六";
}
},
Sun("星期日"){
@Override
publicStringtoLocalWeekDay(){
//处理过程中怎样获取当前的语言环境
return"星期日";
}
};
privatefinalStringday;
privateWeekDayEnum(Stringday){
this.day=day;
}
publicStringtoLocalWeekDay(){
return"";
}
//返回日期
publicStringgetDay(){
returnday;
}
}
测试类:
publicclassEnumTest{
@Test
publicvoidweek(){
//System.out.println(WeekDayEnum.Fri.toLocalWeekDay());
WeekDayday=newWeekDay();
day.setDay(WeekDayEnum.valueOf("Fri"));//通过后台传进来的Fri枚举类型对象来给实体对象的属性赋值(这种方式必不可少!)
System.out.println(day.getDay().toLocalWeekDay());//判断枚举类型对象对应的星期
}
}
显示效果:
希望这些可以帮到正在此处纠结的朋友,也希望大家能从中得到一些帮助。
相关文章推荐
- JAVA数组的定义以及使用1
- java的枚举定义以及使用方法介绍
- 第九节 java数组的介绍,数组定义,数组排序,Arrays类静态方法使用,以及源码解析
- JAVA数组的定义以及使用1
- Java中枚举类的定义及简单使用
- JavaBean定义、JSP中使用以及内省操作
- JAVA数组的定义以及使用1
- java入门学习(13)—枚举类定义及使用初步
- Java接口定义以及使用(标准定义)
- java方法的定义以及数组的使用
- Java定义常量以及在jsp使用常量
- 《Java核心技术》第10版读书笔记之Chap5(5)——Java中变参函数以及枚举类的原理与使用
- Java接口定义以及使用(代理设计)
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- Java学习笔记十四:如何定义Java中的类以及使用对象的属性
- Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用
- java中枚举型的定义以及使用
- Java接口的定义以及使用(工厂模式)
- 使用Java进行双向认证的SSL链接以及使用OpenSSL生产证书链
- 160817、Java数据类型以及变量的定义