看到这个标题,很多人不禁要问---什么是枚举类而且为什么用枚举类呢?那是因为,一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
举个简单的例子,我们每个人都有性别,分为“男”和“女”两种,为了限定这两种情况我们就必须限定这两种情况。下面就请大家看看怎样几种手动的实现枚举的方法:
Person类:
//手动实现枚举
public class Person {
private String sex;
//利用正则表达式来限制
public void setSex(String sex) {
if(sex.matches("[男女]")){
System.out.println("此性别可以识别!");
}else{
System.out.println("此性别不可识别!");
//throw new RuntimeException("此性别不可识别!");
}
}
public String toString() {
return "Person [sex=" + sex + "]";
}
}
测试类:
import domain.Person;
public class PersonTest {
public static void main(String[] args) {
Person p=new Person();
p.setSex("人妖");
System.out.println(p.toString());
}
}
输出效果:
手动实现枚举类:
通过
private
将构造器隐藏起来
把这个类的所有可能实例都使用
public static final
修饰
属性不应允许被改动
,
所以应该使用
private final
修饰
Sex类:
public class Sex {
// 性别男
public static final Sex m = new Sex("男");
// 性别女
public static final Sex f = new Sex("女");
private final String value;
private Sex(String value) {
this.value = value;
}
// 让外界访问所定义的性别
public String getValue() {
return value;
}
}
测试类:
public class Sex {
// 性别男
public static final Sex m = new Sex("男");
// 性别女
public static final Sex f = new Sex("女");
private final String value;
private Sex(String value) {
this.value = value;
}
// 让外界访问所定义的性别
public String getValue() {
return value;
}
}
输出效果:
看完上面的代码,我们不难发现,上面写法比较麻烦,而
java
中提供了一种更方便的方法
----
枚举类可以解决上面的问题
JDK1.5
新
增的
enum
关键字
用于定义
枚举类
枚举类也是一种特殊形式的
Java
类
。
枚举类和普通类的区别:
使用
enum
定义的枚举类默认继承了
java.lang.Enum
类
枚举类的构造器只能使用
private
访问控制符
枚举类的所有实例必须在枚举类中显式列出
(,
分隔
;
结尾
).
列出的实例系统会自动添加
public static final
修饰
枚举类的属性:
枚举类对象的属性不应允许被改动
,
所以应该使用
private final
修饰
枚举类的使用
private final
修饰的属性应该在构造器中为其赋值
若枚举类显式的定义了带参数的构造器
,
则在列出枚举值时也必须对应的传入参数
那么该如何定义呢?
枚举类定义:
/**
* 枚举类
*
* @author LiZhuo
* 我们需要注意三点(关于枚举类的属性)
*/
public enum SexEnume {
// 系统为这两个对象默认的加上了public static final
M("男"), F("女");
// 1.枚举类对象的属性不应允许被改动,所以应该使用private final 修饰
private final String value;
// 构造器
// 2.枚举类的使用private final 修饰的属性因该在构造器中为其赋值
private SexEnume(String value) {
this.value = value;
}
public String getValue() {
return value;
}
// 3.若枚举类显示的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
}
同时,枚举类有三种形式(分别为:没有参数的构造方法,带参数的构造方法,使用内部类)。在这里,给大家分享后两种形式的枚举类。
1.带参数的构造方法,功能(性别的获取)
枚举类:
/**
* 枚举类
*
* @author LiZhuo
* 我们需要注意三点(关于枚举类的属性)
*/
public enum SexEnume {
// 系统为这两个对象默认的加上了public static final
M("男"), F("女");
// 1.枚举类对象的属性不应允许被改动,所以应该使用private final 修饰
private final String value;
// 构造器
// 2.枚举类的使用private final 修饰的属性因该在构造器中为其赋值
private SexEnume(String value) {
this.value = value;
}
public String getValue() {
return value;
}
// 3.若枚举类显示的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
}
测试类:
public class EnumTest {
@Test
public void test() {
/**
* <form>
* <select name="sex">
* <option value="M">男</option>
* <option value="F">女</option>
* </select>
* </form>
*/
//枚举类.valueOf("枚举类对象名称");
SexEnume sexEnume = SexEnume.valueOf("F");// 返回制定的枚举类对象
System.out.println(sexEnume.getValue());// 通过枚举类中的get方法获得制定的值
//ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
System.out.println("性别男所在位置:"+sexEnume.ordinal());
//values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
SexEnume sexs[]=SexEnume.values();
//遍历
for(SexEnume sex:sexs){
System.out.println("------"+sex.getValue());
}
/**
* 因为会关联到一些特定的值,所以需要用枚举来进行匹配
*/
}
}
显示效果:
2.使用内部类的枚举类,功能():
枚举类:
//使用内部类来实现
/**
* 练习:请编写一个关于星期几的枚举WeekDay,要求: 枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun
* 该枚举要有一个方法,调用该方法返回中文格式的星期。
*/
// ,Tue,Wed,Thu,Fri,Sat,Sun
public enum WeekDayEnum {
Mon("星期一") {
@Override
public String toLocalWeekDay() {
return "星期一";
}
},
Tue("星期二") {
@Override
public String toLocalWeekDay() {
return "星期二";
}
},
Wed("星期三") {
@Override
public String toLocalWeekDay() {
return "星期三";
}
},
Thu("星期四") {
@Override
public String toLocalWeekDay() {
return "星期四";
}
},
Fri("星期五") {
@Override
public String toLocalWeekDay() {
return "星期五";
}
},
Sat("星期六") {
@Override
public String toLocalWeekDay() {
return "星期六";
}
},
Sun("星期日") {
@Override
public String toLocalWeekDay() {
//处理过程中怎样获取当前的语言环境
return "星期日";
}
};
private final String day;
private WeekDayEnum(String day) {
this.day = day;
}
public String toLocalWeekDay() {
return "";
}
//返回日期
public String getDay() {
return day;
}
}
测试类:
public class EnumTest {
@Test
public void week(){
//System.out.println(WeekDayEnum.Fri.toLocalWeekDay());
WeekDay day=new WeekDay();
day.setDay(WeekDayEnum.valueOf("Fri"));//通过后台传进来的Fri枚举类型对象来给实体对象的属性赋值(这种方式必不可少!)
System.out.println(day.getDay().toLocalWeekDay());//判断枚举类型对象对应的星期
}
}
显示效果:
希望这些可以帮到正在此处纠结的朋友,也希望大家能从中得到一些帮助。