努力的小胖学习记录(八)-------java枚举

  • 枚举的定义
    关键字enum可以将一组具名的值得有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。
    例如:我们定义一个比赛状态的枚举,有三个状态,赢,平,输,代码的实现如下
public enum OutCome {
    WIN,LOSE,DRAW;
}

在使用的时候直接使用OutCome.WIN,和使用类的静态变量一样。

  • 枚举的实现
    我们都知道枚举除了有我们自己定义的一些方法外,还有一些其它的方法,比如values()返回该枚举下的所有实例,ordinal()返回当前实例的位置。那么它们都是如何实现的呢。
    首先给大家看一个api,java.lang.Enum,这个类是不是很熟悉?是不是和enum枚举关键字很靠近。首先,我们可以看这个类的结构和方法属性
    类继承结构
    方法和属性
    是不是出现很多我们在枚举看到的方法,比如name(),compareTo(),ordinal()等,我们初步猜想枚举就是继承了了这个类,接下来我们验证下
    推论结果验证
    事实证明,我们的猜想是正确,可是好奇的是,为什么我们的这个类没有我们常用的values()方法,我们先看看enum的类继承关系:
    在这里插入图片描述
    从出的结果可以看出,枚举并没有另外自己实现任何接口,那他是什么实现values的呢?我们直接使用javap查看编译后的class文件
    枚举变异后的文件
    从文件可以看出,编译器其实为每个枚举类不只是新增了一个values()方法,而且还增加了一个valueOf(String)的方法(Enum类有一个valueOf(Class,String)),那现在为什么枚举那么强大就一目了然了。
  • 手写一个枚举类
package com.hxw.enums;

public class ManualEnum{// extends Enum(直接继承会报错,不然如果可以直接继承就完美了,想写的好一点就把Enum父类提供的方法也实现下)
    public static final ManualEnum A = new ManualEnum("A",0);
    public static final ManualEnum B = new ManualEnum("B",1);
    public static final ManualEnum C = new ManualEnum("C",2);
    public static final ManualEnum D = new ManualEnum("D",3);
    private ManualEnum(String name,int ordinal){}
    public static final ManualEnum[] values(){
        ManualEnum[] values = new ManualEnum[]{A,B,C,D};
        return values;
    }
    public static final ManualEnum valueof(String name){
        if("A".equals(name)){
            return A;
        }
        if("B".equals(name)){
            return B;
        }
        if("C".equals(name)){
            return C;
        }
        if("D".equals(name)){
            return D;
        }
        return null;
    }
}

这里很核心的地方就是构造方法私有和创建静态常量供外部访问。

  • 使用场景
    在实际项目中,枚举用的最多的就是定义常量或者字典中。所以使用场景很简单,也很常用。但我推荐一种我自己认为还不错的一种用途,可以认为是一种状态模式或者策略模式的简单版本:
    枚举另类使用场景
    这个枚举就是对应一个指令的类型,针对每个类型,处理方式不一样,我这里只是简单的返回注册信息,如果在复杂一点,你可以返回一个CommandHandler,具体处理逻辑放在这个commandHandler中。

可能最近分享的东西比较简单,但是我觉得这个一个习惯的开始,重在坚持,希望大家能多多支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值