黑马程序员技术博客之枚举

1 篇文章 0 订阅

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

枚举是为了让程序变得优雅、简洁而存在的。

下面的代码模拟了一个枚举类:


public class Season implements Comparable

{

    private Season(String s)

    {

        m_ordinal = m_nextOrdinal++;

        m_name = s;

    }

 

    public String toString()

    {

        return m_name;

    }

 

    public String Name()

    {

        return m_name;

    }

 

    public int compareTo(Object obj)

    {

        return m_ordinal - ((Season)obj).m_ordinal;

    }

 

    public static final Season[] values()

    {

        return m_seasons;

    }

 

    public static Season valueOf(String s)

    {

        for(int i = 0; i < m_seasons.length; i++)

            if(m_seasons[i].Name().equals(s))

                return m_seasons[i];

 

        throw new IllegalArgumentException(s);

    }

 

    private final String m_name;

    private static int m_nextOrdinal = 0;

    private final int m_ordinal;

    public static final Season SPRING;

    public static final Season SUMMER;

    public static final Season FALL;

    public static final Season WINTER;

    private static final Season m_seasons[];

 

    static 

    {

        SPRING = new Season("Spring");

        SUMMER = new Season("Summer");

        FALL = new Season("Fall");

        WINTER = new Season("Winter");

        m_seasons = (new Season[] {

            SPRING, SUMMER, FALL, WINTER

        });

    }

}


而枚举的作用就是自动的帮我们建立诸如这样的类,

可以认为枚举其实就是一个“程序生成器”,我们按照它的语法规则定义枚举,而后运行这个“程序生成器”,它就会自动的帮助我们生成和下面这段代码类似的枚举类。

利用枚举这个“程序生成器”帮助我们定义枚举的代码如下:

public enum Season

{

    SPRING, SUMMER, FALL, WINTER

}

实际上当JVM读到我们上面的这段代码后就会自动的帮我们转换成与前面我们自己模拟的那个枚举大致相同的代码,对这段代码反编译之后得到如下代码:


public final class Season extends Enum

{

    public static final Season[] values()

    {

        return (Season[])$VALUES.clone();

    }

 

    public static Season valueOf(String s)

    {

        Season aseason[] = $VALUES;

        int i = aseason.length;

        for(int j = 0; j < i; j++)

        {

            Season season = aseason[j];

            if(season.name().equals(s))

                return season;

        }

        throw new IllegalArgumentException(s);

    }

 

    private Season(String s, int i)

    {

        super(s, i);

    }

 

    public static final Season SPRING;

    public static final Season SUMMER;

    public static final Season FALL;

    public static final Season WINTER;

 

    private static final Season $VALUES[];

 

    static 

    {

        SPRING = new Season("SPRING", 0);

        SUMMER = new Season("SUMMER", 1);

        FALL = new Season("FALL", 2);

        WINTER = new Season("WINTER", 3);

        $VALUES = (new Season[] {

            SPRING, SUMMER, FALL, WINTER

        });

    }

}



Java 1.5中定义一个枚举类型的基本要求。
  1. 使用关键字enum
  2. 类型名称,比如这里的Season
  3. 一串允许的值,比如上面定义的春夏秋冬四季
  4. 枚举可以单独定义在一个文件中,也可以嵌在其它Java类中


    除了这样的基本要求外,用户还有一些其他选择
  1.枚举可以实现一个或多个接口(Interface)
  2.可以定义新的变量
  3.可以定义新的方法
  4.可以定义根据具体枚举值而相异的类


Java 1.5中的枚举实现不是在Java虚拟机层次实现的枚举,而是在编译器层次实现的,本质上是一种“Java程序自动生成器”。
这样的实现的好处是Java 1.5的虚拟机不必要做大的改动,在以有的基础上改进和完善就可以了。
同时这种做法还使得程序有比较好的向前兼容性。在Java 编译器层增加功能,而不是大的更动以有的Java虚拟机。


其它要点:
1、所有的枚举类型都是隐式的衍生于基类java.lang.Enum。
Enum类可以内部隐式的被扩展,去不允许你直接显式的去扩展。
2、枚举类型是无法扩展的

关于枚举的使用,可以查看下面这篇文章。

Java枚举常见用法

说明:该文部分借鉴了:《深入Java1.5枚举类型的内部》一文。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值