Java中枚举类的定义以及使用

 


    看到这个标题,很多人不禁要问---什么是枚举类而且为什么用枚举类呢?那是因为,一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在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());//判断枚举类型对象对应的星期
	}
}


显示效果:

 

 希望这些可以帮到正在此处纠结的朋友,也希望大家能从中得到一些帮助。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值