zoukankan      html  css  js  c++  java
  • 关于枚举

    一个简单的例子:

     

    枚举定义类:

     

    测试类:

     

    关键词:实例,常量

    枚举也是一个类。从测试类的第5行知,枚举变量的声明与一般对象类的声明是相同的(Spiciness howHot = ...)

    枚举定义类的第4行:NOT,MILD...,每一串字母都是一个实例,每一个实例都是常量。即:Spiciness这个枚举类在声明时与一般声明相同:Spiciness howHot=...,而等号后面的具体实例只能有五个值:Spiciness.NOT,Spiciness.MILD等等。

    常量也有自己的方法

     

    ordinal():某个enum实例在所有实例中的位置。(比如上例:Spiciness.MEDIUM.ordinal() == 2)。

    注意,这里ordinal()是实例对象调用的。

    values():静态方法,按照所有常量在枚举中的位置,返回所有常量构成的数组:

     

    注意,values()是静态方法,直接用Spiciness调用。

    关键词:java.lang.Enum

     

    你创建enum时,编译器会为这个enum生成一个枚举类,这个类继承自:java.lang.Enum。

    编译器会为这个枚举类自动加上toString()、hashCode()等方法,所以,在不同的枚举常量之间,可以用equals==去比较引用、比较值等:(注意equals==的区别,equalshashCode的关系)

    Enum类实现了Comparable接口,所以,枚举之间可以用compareTo方法比较。

    像一般类一样对待enum

    看上面的代码,除了一些特殊的限制之外,enum也是一个类,它继承自Enum类,那么,我们就可以按照操作一般类的方式去操作enum

    比如,第13行,加了一个私有构造器(私有构造器使得我们不能从类的外部使用new的方式创建一个实例,但对于枚举类,即使你在这里写一个public,我们也不能从外部创建实例,还是要从内部创建)。

    1117行等,都是像一般类一样定义变量、方法。

    而由于WEST、NORTH等本身就是enum内部创建的实例,那么由于你定义的构造函数中有参数,就要给WEST、NORTH等实例常量后面加上参数(类似于一般类创建实例的方式)。

    不过这里有一个限制,在定义方法之前,必须首先定义enum实例,即:56789行必须写在前面。

    关键词:switch

    枚举本来就是常量,用在switch中再合适不过,用法也比较简单,举例略。

    关键词:values()

    前面说过,values()方法是一个静态方法,但更有趣的是,enum的父类Enum类是没有这个方法的,values()方法是enum在编译时,编译器加上的。

    既然父类Enum没有values()方法,那如果把enum类“向上转型”为Enum类型,就访问不到values()方法了:

     

    但是天无绝人之路,你如果真想获取实例常量数组的话,还是有办法的。通过反射获取enumClass,你会发现,Class正好有个getEnumConstants()可以满足你的需求:

     

    更多内容请关注微信订阅号:it_pupil

     

     

     

  • 相关阅读:
    一个bug案例分析
    《需求工程》阅读随笔-1.做什么和怎么做
    连贯接口(fluent interface)的Java实现及应用。
    代码覆盖率检测工具大全
    腾讯的一个移动端测试小工具GT
    用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
    淘客API升级后的解决方案,怎么采集淘宝的商品数据
    方维团购系统,给供货商添加省市地址
    支付宝担保交易收款接口使用
    方维分享系统首页,插入新品,用来做优化
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/6072264.html
Copyright © 2011-2022 走看看