zoukankan      html  css  js  c++  java
  • Java中的枚举--Enumeration

      之前并没有注意到枚举这个知识点,因为之前在项目中并没有使用过枚举,可能是项目并不是很复杂的原因吧,今天看张孝祥老师的讲解,觉得,这个枚举真的有很多值得学习的地方,探究一下枚举的设计原理,底层到底是怎么回事。

    一、枚举的介绍

    1、枚举用于表示编程语言中的一组命名常量

    例如,一副牌中的四个套装可以是四个名为Club,Diamond,Heart和Spade的枚举器,属于名为Suit的枚举类型。其他示例包括天然枚举类型(例如行星,星期几,颜色,方向等)。 当我们在编译时知道所有可能的值时使用枚举,例如菜单上的选择,舍入模式,命令行标志等。枚举类型中的常量集不必始终固定。

    2、在Java中(从1.5开始),枚举使用枚举数据类型表示

    Java枚举比C / C ++枚举更强大。在Java中,我们还可以向其中添加变量,方法和构造函数。枚举的主要目标是定义我们自己的数据类型(enumer数据类型)。

    二、枚举的使用

    简单的使用,一般都是直接定义一些值,其实本质是一个个的对象,但是其实枚举也有复杂的使用方法,下面是一个复杂的使用方法的例子:

    其实从内部类就可以看出来,定义的那些值真的是enum关键字修饰的对象,重写了父类的抽象方法,注意:定义的对象必须放在最上面

     1 public enum TrafficLamp {
     2 
     3     RED(30) {
     4 
     5         @Override
     6         public TrafficLamp nextLamp() {
     7             return GREEN;
     8         }
     9     },
    10     GREEN(45) {
    11 
    12         @Override
    13         public TrafficLamp nextLamp() {
    14             return YELLOW;
    15         }
    16     },
    17     YELLOW(5) {
    18 
    19         @Override
    20         public TrafficLamp nextLamp() {
    21             return RED;
    22         }
    23     };
    24 
    25     public abstract TrafficLamp nextLamp();
    26     
    27     private int time;
    28     
    29     private TrafficLamp(int time){
    30         this.time = time;
    31     }
    32 }

    三、枚举的原理

    在第二个中其实已经介绍了一些枚举类的实际本质的东西,张孝祥老师用class类实现枚举,其中用到了内部类的概念,在编译之后,会形成四个class文件,内部类被编译成class文件。

     1 public abstract class TrafficLamp2 {
     2 
     3     /**
     4      * 红灯 等待30秒
     5      */
     6     public final static TrafficLamp2 RED = new TrafficLamp2(30) {
     7 
     8         @Override
     9         public TrafficLamp2 nextLamp() {
    10             return GREEN;
    11         }
    12 
    13         @Override
    14         public String toString() {
    15             return "RED";
    16         }
    17     };
    18 
    19     /**
    20      * 绿灯 等待45秒
    21      */
    22     public final static TrafficLamp2 GREEN = new TrafficLamp2(45) {
    23 
    24         @Override
    25         public TrafficLamp2 nextLamp() {
    26             return YELLOW;
    27         }
    28 
    29         @Override
    30         public String toString() {
    31             return "GREEN";
    32         }
    33     };
    34 
    35     /**
    36      * 黄灯 等待5秒
    37      */
    38     public final static TrafficLamp2 YELLOW = new TrafficLamp2(5) {
    39 
    40         @Override
    41         public TrafficLamp2 nextLamp() {
    42             return RED;
    43         }
    44 
    45         @Override
    46         public String toString() {
    47             return "YELLOW";
    48         }
    49     };
    50 
    51     public abstract TrafficLamp2 nextLamp();
    52     
    53     public abstract String toString();
    54 
    55     private int time;
    56 
    57     /**
    58      * 私有化构造方法
    59      * 
    60      * @param time
    61      */
    62     private TrafficLamp2(int time) {
    63         this.time = time;
    64     }
    65 }
  • 相关阅读:
    JavaScript AMD 模块加载器原理与实现
    nodejs之日志管理
    实时监测每秒上行下行流量,一款 iOS Today Widget 监测器Demo,还可以可以监测内存大小、存储空间等信息
    Swift 2.0基本语法
    【京东助手】滑稽东试用助手 V1.6.0
    我也秀秀windows phone版博客园客户端
    asp.net做的网站账号登陆后注销不管用了
    分享个自己做的CSDN刷下载积分软件
    推荐一个很好用的HTTP操作类
    新软件马上就要完成了,先发篇文章YY下
  • 原文地址:https://www.cnblogs.com/ssh-html/p/10629409.html
Copyright © 2011-2022 走看看