zoukankan      html  css  js  c++  java
  • Java_枚举类

    枚举类

    枚举类不出来的时候只能如下写代码

     1 //Student.java
     2 package cn.itcast.enumeration;
     3 
     4 public class Student {
     5     private String name;
     6     private String grade;//A B C D E
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public String getGrade() {
    14         return grade;
    15     }
    16     public void setGrade(String grade) {
    17         if(!grade.matches("[ABCDE]")){
    18             throw new RuntimeException("成绩输入错误");
    19         }
    20         this.grade = grade;
    21     }
    22 }

    第17行代码使用了正则表达式。

     1 //Test.java
     2 package cn.itcast.enumeration;
     3 
     4 public class Test {
     5 
     6     public static void main(String[] args) {
     7         // TODO Auto-generated method stub
     8         Student s = new Student();
     9         s.setGrade("H");
    10     }
    11 }

    这个代码有一点不好,就是给赋值了,但是程序运行是才报错。如何让写代码的时候就报错?看如下代码。

     1 //Student.java
     2 package cn.itcast.enumeration2;
     3 
     4 public class Student {
     5     private String name;
     6     private Grade grade;//A B C D E
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public Grade getGrade() {
    14         return grade;
    15     }
    16     public void setGrade(Grade grade) {
    17         this.grade = grade;
    18     }
    19 }
    20 
    21 class Grade{
    22     private Grade(){}
    23     
    24     public static Grade A = new Grade();
    25     public static Grade B = new Grade();
    26     public static Grade C = new Grade();
    27     public static Grade D = new Grade();
    28     public static Grade E = new Grade();
    29 }

    定义一个自己使用的类,再赋值的时候只能赋指定的值,其他值都报错。

     1 //Test.java
     2 package cn.itcast.enumeration2;
     3 
     4 public class Test {
     5 
     6     public static void main(String[] args) {
     7         // TODO Auto-generated method stub
     8         Student s = new Student();
     9         s.setGrade(Grade.A);
    10     }
    11 }

    这种方法太复杂,下面使用枚举,只要三行就能取代21-29行的代码

     1 //Student.java
     2 package cn.itcast.enumeration3;
     3 
     4 public class Student {
     5     private String name;
     6     private Grade grade;//A B C D E
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public Grade getGrade() {
    14         return grade;
    15     }
    16     public void setGrade(Grade grade) {
    17         this.grade = grade;
    18     }
    19 }
    20 /*
    21 class Grade{
    22     private Grade(){}
    23     
    24     public static Grade A = new Grade();
    25     public static Grade B = new Grade();
    26     public static Grade C = new Grade();
    27     public static Grade D = new Grade();
    28     public static Grade E = new Grade();
    29 }
    30 */
    31 enum Grade{//也是定义了一个类
    32     A,B,C,D,E;//对应的是Grade类的对象
    33 }

    使用枚举类取代21-29行的代码。

     1 package cn.itcast.enumeration3;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         Student s = new Student();
     8         s.setGrade(Grade.A);
     9     }
    10 }

    这种方法比较好,但是如何在枚举类里面封装更多的信息?看下面的代码

     1 //Student.java
     2 package cn.itcast.enumeration4;
     3 
     4 public class Student {
     5     private String name;
     6     private Grade grade;//A B C D E
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public Grade getGrade() {
    14         return grade;
    15     }
    16     public void setGrade(Grade grade) {
    17         this.grade = grade;
    18     }
    19 }
    20 /*
    21 class Grade{
    22     private Grade(){}
    23     
    24     public static Grade A = new Grade();
    25     public static Grade B = new Grade();
    26     public static Grade C = new Grade();
    27     public static Grade D = new Grade();
    28     public static Grade E = new Grade();
    29 }
    30 */
    31 //如何让枚举封装更多的信息(如何让枚举对象拥有自己的属性)
    32 enum Grade{//也是定义了一个类
    33     A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");//对应的是Grade类的对象
    34     
    35     private String value;
    36     private Grade(String value){
    37         this.value = value;
    38     }
    39     public String getValue(){
    40         return value;
    41     }
    42 }

    封装成绩的同时,可以封装分数段,增加属性。

     1 //Test.java
     2 package cn.itcast.enumeration4;
     3 
     4 public class Test {
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         Student s = new Student();
     8         s.setGrade(Grade.A);
     9         System.out.println(Grade.A.getValue());
    10     }
    11 }

    那么如何在枚举类里面封装各自的方法呢?看下面的代码。

     1 //Student.java
     2 package cn.itcast.enumeration6;
     3 
     4 public class Student {
     5     private String name;
     6     private Grade grade;//A B C D E
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public Grade getGrade() {
    14         return grade;
    15     }
    16     public void setGrade(Grade grade) {
    17         this.grade = grade;
    18     }
    19 }
    20 /*
    21 class Grade{
    22     private Grade(){}
    23     
    24     public static Grade A = new Grade();
    25     public static Grade B = new Grade();
    26     public static Grade C = new Grade();
    27     public static Grade D = new Grade();
    28     public static Grade E = new Grade();
    29 }
    30 */
    31 //如何让枚举对象拥有自己的属性和各自的方法
    32 enum Grade{//也是定义了一个类
    33     A("100-90"){
    34         public String toLocalString(){
    35             return "优";
    36         }
    37     },B("89-80"){
    38         public String toLocalString(){
    39             return "良";
    40         }
    41     },C("79-70"){
    42         public String toLocalString(){
    43             return "中";
    44         }
    45     },D("69-60"){
    46         public String toLocalString(){
    47             return "一般";
    48         }
    49     },E("59-0"){
    50         public String toLocalString(){
    51             return "差";
    52         }
    53     };//对应的是Grade类的对象
    54     
    55     private String value;
    56     private Grade(String value){
    57         this.value = value;
    58     }
    59     public String getValue(){
    60         return value;
    61     }
    62     public abstract String toLocalString();
    63 }

    返回成绩的中文表示。

     1 package cn.itcast.enumeration6;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         Student s = new Student();
     8         s.setGrade(Grade.A);
     9         System.out.println(Grade.A.getValue());
    10         System.out.println(Grade.A.toLocalString());
    11     }
    12 }

    注意:枚举类的对象的方法必须是私有的,不能公有。

    枚举类有如下特性:

    1.枚举类也是一种特殊的Java类。

    2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。

    3.与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但是枚举类的构造函数必须为室友的(这点不难理解)。

    4.枚举类也可以实现接口、或基层抽象类。

    5.JDK5中扩展了switch语句,它除了可以接收int、byte、char、short外,还可以接收一个枚举类型。

    6.若枚举类只有一个枚举值,则可以当做单态设计模式。

     下面这样写也是单态设计模式。

    1 enum Demo{
    2     demo;
    3 }

    枚举类的常用方法

     1 public void test(){
     2     //枚举类的常用方法name,valueOf,values
     3     String name = "B";
     4     Grade g = Grade.valueOf(name);//把字符串转成枚举对象
     5     System.out.println(g.name());//获取枚举对象名称
     6         
     7     Grade gs[] = Grade.values();
     8     for(Grade g1:gs){
     9         System.out.println(g1.name());
    10     }
    11 }
    心再坚强也不要独自飞翔
  • 相关阅读:
    android 中管理短信
    Note: log switch off, only log_main and log_events will have logs!
    Android中内容观察者的使用---- ContentObserver类详解 (转)
    Mac下eclipse安装SVN插件
    手把手教你在Eclipse中使用CVS Branch功能
    DIV+CSS命名规范-转载2
    DIV+CSS命名规范-转载1
    仓库入仓-手机条码扫描
    速卖通承认的承运商代码
    同一个仓库,供应商和分销商的库存同时存在的问题
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6362269.html
Copyright © 2011-2022 走看看