java之枚举类 Enum学习笔记

某些情况下,一个类的对象是有限并且固定的,比如季节类,只有四个对象。这种实例有限并且固定的类,为枚举类。
如何手动实现一个枚举类?
规则如下: 
    (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;
        }
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值