java之枚举类 Enum学习笔记

来源:互联网 发布:什么是网络市场营销 编辑:程序博客网 时间:2024/04/28 16:46
某些情况下,一个类的对象是有限并且固定的,比如季节类,只有四个对象。这种实例有限并且固定的类,为枚举类。
如何手动实现一个枚举类?
规则如下: 
    (1)通过private将构造器隐藏起来
    (2)把这个类所有可能的实例都使用public static final 修饰的类变量来保存

举个例子:

public class Season {    private String name;    private String desc;    private Season(String name, String desc){        this.name = name;        this.desc = desc;    }    public String getName(){        return this.name;    }    public String getDesc(){        return this.desc;    }    public static final Season SPRING = new Season("春天","趁春踏青");    public static final Season SUMMER = new Season("夏天","夏日炎炎");    public static final Season FALL = new Season("秋天","秋高气爽");    public static final Season WINTER = new Season("冬天","冬雪三尺");        public static Season getSeason(int seasonNum){        switch(seasonNum){            case 1:                return SPRING;            case 2:                return SUMMER;            case 3:                return FALL;            case 4:                return WINTER;            default:                return null;        }    }}

这个例子中,Season是一个不可变类。当其他程序要使用它的时候,可以使用getSeason()这个静态工厂方法来获取Season对象。

java中有封装好的枚举类,用关键字enum来定义,举一个小例子:
public enum SeasonEnum {    SPRING,SUMMER,FALL,WINTER;} 
定义枚举类需要注意一下几个问题:
(1)一个java源文件只能定义一个public访问权限的枚举类,并且该java源文件也必须和该枚举类的类名相同。
(2)枚举类默认使用final关键字修饰,所以不能派生子类。
(3)枚举类的构造方法只能用private修饰,不论显式还是隐式。
(4)枚举类的所有实例,必须在枚举类的第一行显式列出,否则这个枚举类不能产生实例。 
public class SeasonEnumTestDemo_01 {    public static void main(String[] args){        for(SeasonEnum s : SeasonEnum.values()){            System.out.println(s);        }        judge(SeasonEnum.SPRING);    }    public static void judge(SeasonEnum s){        switch(s){            case SPRING:                System.out.println("春天");                break;            case SUMMER:                System.out.println("夏天");                break;            case FALL:                System.out.println("秋天");                break;            case WINTER:                System.out.println("冬天");                break;        }    }} 
输出: 
SPRING
SUMMER
FALL
WINTER
春天
枚举类有一些常用的方法,比如compareTo(),toString(),valueOf()等,详细用法查看java API。

在一个枚举类中,可以定义类的属性,也就是类的实例变量。比如:
public enum Gender {    MALE, FEMALE;    public String name;}  public class GenderTestDemo_01 {    public static void main(String[] args){        Gender g = Enum.valueOf(Gender.class, "FEMALE");        g.name = "女";        System.out.println(g+"代表"+g.name);        }}  
以上,枚举类的实例只能是枚举值,不能随意的通过new来创建枚举类对象。
但是,一般的类,不会将成员变量的权限设置为public,类对外开放的是成员函数。所以,可以对以上的枚举类做一个改进。
public enum Gender1 {    MALE,FEMALE;    private String name;    public String getName(){        return this.name;    }    public void setName(String name){        switch(this){            case MALE:                if(name.equals("男")){                    this.name = name;                }else{                    System.out.println("参数错误!");                    return;                }                break;            case FEMALE:                if(name.equals("女")){                    this.name = name;                }else{                    System.out.println("参数错误!");                    return;                }                break;        }    }}






0 0