您的位置:首页 > 编程语言 > Java开发

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());//判断枚举类型对象对应的星期
}
}


显示效果:



希望这些可以帮到正在此处纠结的朋友,也希望大家能从中得到一些帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: