赵雅智_Java JDK 5.0 枚举

来源:互联网 发布:淘宝如何改发货地址 编辑:程序博客网 时间:2024/06/10 16:07
为什么需要枚举?

一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值

此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。

JDK 5新增的 enum 关键字用于定义一个枚举类。

枚举类练习

   设计一个Student类
   class  Student{
   private String name;
   private Grade grade;
   ……}

  要求:学生的grade只能是a,b,c,d,e五个级别。可以给学生设置成绩,并可以输出学生成绩情况(优,良,中,可,差)

package com.hbsi.enum1;public class Student {private String name;private String grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {if(!grade.matches("[ABCDE]")){throw new IllegalArgumentException("输入的成绩不符合要求!!");}this.grade = grade;}}

package com.hbsi.enum1;public class Demo1 {/** * @param args */public static void main(String[] args) {Student s=new Student();s.setName("张三");s.setGrade("F");}}



手动实现枚举类:

  • 通过 private 将构造器隐藏起来
  • 把这个类的所有可能实例都使用 public static final 修饰
  • 属性不应允许被改动, 所以应该使用 private final 修饰

package com.hbsi.enum2;public class Student {private String name;private Grade grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}}class Grade{private Grade(){}public static final Grade A=new Grade();public static final Grade B=new Grade();public static final Grade C=new Grade();public static final Grade D=new Grade();public static final Grade E=new Grade();}

package com.hbsi.enum2;public class Demo1 {/** * @param args */public static void main(String[] args) {Student s=new Student();s.setName("张三");s.setGrade(Grade.A);}}


上面写法比较麻烦,java中提供了一种更方便的方法----枚举类可以解决上面的问题

JDK 1.5 新增的 enum 关键字用于定义枚举类

枚举类也是一种特殊形式的Java类。

枚举类和普通类的区别:

  • 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
  • 枚举类的构造器只能使用 private 访问控制符
  • 枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾). 列出的实例系统会自动添加 public static final 修饰
  • JDK5中扩展了switch语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型
  • 若枚举只有一个成员, 则可以作为一种单例模式的实现方式

没有参数的构造方法:

package com.hbsi.enum2;public class Student {private String name;private Grade grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}}enum Grade{A,B,C,D,E;}/*class Grade{private Grade(){}public static final Grade A=new Grade();public static final Grade B=new Grade();public static final Grade C=new Grade();public static final Grade D=new Grade();public static final Grade E=new Grade();}*/
package com.hbsi.enum2;public class Demo1 {/** * @param args */public static void main(String[] args) {Student s=new Student();s.setName("张三");s.setGrade(Grade.A);}}

枚举类的属性

  • 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
  • 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
  • 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
带参数的构造方法:
package com.hbsi.enum3;public class Student {private String name;private Grade grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}}enum Grade{A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");private String value;private Grade(String value){this.value=value;}public String getValue() {return value;}}
package com.hbsi.enum3;public class Demo1 {/** * @param args */public static void main(String[] args) {Student s=new Student();s.setName("张三");s.setGrade(Grade.A);System.out.println(Grade.B.getValue());}}

使用内部类:

package com.hbsi.enum4;public class Student {private String name;private Grade grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}}enum Grade{A("100-90") {@Overridepublic String toLocalGrade() {// TODO Auto-generated method stubreturn "优";}},B("89-80") {@Overridepublic String toLocalGrade() {// TODO Auto-generated method stubreturn "良";}},C("79-70") {@Overridepublic String toLocalGrade() {// TODO Auto-generated method stubreturn "中";}},D("69-60") {@Overridepublic String toLocalGrade() {// TODO Auto-generated method stubreturn "可";}},E("59-0") {@Overridepublic String toLocalGrade() {// TODO Auto-generated method stubreturn "差";}};private String value;private Grade(String value){this.value=value;}public String getValue() {return value;}public abstract String toLocalGrade();}
package com.hbsi.enum4;public class Demo1 {/** * @param args */public static void main(String[] args) {Student s=new Student();s.setName("张三");s.setGrade(Grade.A);   String str=Grade.B.getValue();   String str1=Grade.B.toLocalGrade();   System.out.println(str+"...."+str1);}}

枚举类常用方法:

Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:

  • name():返回此枚举常量的名称,在其枚举声明中对其进行声明 
  • ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 
  • valueof(Class enumClass, String name):返回带指定名称的指定枚举类型的枚举常量。 静态方法
  • values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。

练习:请编写一个关于星期几的枚举WeekDay

要求:
枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 
该枚举要有一个方法,调用该方法返回中文格式的星期。

package net.csdn.high;public class TestWeek {private Week week;public Week getWeek() {return week;}public void setWeek(Week week) {this.week = week;}}enum Week{Mon("Monday") {@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期一";}},Tue("Tuesday") {@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期二";}},Wed("Wednesday") {@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期三";}},Thu("Thuesday") {@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期四";}},Fri("Friday") {@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期五";}},Sat("Satueday"){@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期六";}},Sun("Sunday"){@Overridepublic String toLocalWeek() {// TODO Auto-generated method stubreturn "星期日";}};private String value;private Week(String value){this.value=value;}public String getValue() {return value;}public abstract String toLocalWeek();}


 

package net.csdn.high;public class TestWeekDay {/** * @param args */public static void main(String[] args) {TestWeek t = new TestWeek();t.setWeek(Week.Mon);   String str=Week.Mon.getValue();   String str1=Week.Mon.toLocalWeek();   System.out.println(str+"...."+str1);}}




 



原创粉丝点击