枚举

作者: hainingwyx | 来源:发表于2017-03-08 11:03 被阅读20次

写在之前

以下是《Java8编程入门官方教程》中的一些知识,如有错误,烦请指正。涉及的程序如需下载请移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip

枚举

定义新的数据类型的命名常量列表。一般使用枚举常量使用大写。这是因为枚举经常代替final变量,而final变量通常是大写的,所以程序员自然也习惯对枚举常量使用大写。Java将枚举实现为类类型,尽管不会使用new实例化枚举,但是可以给枚举提供构造函数,添加实例变量和方法,甚至实现接口。

// 枚举的创建和基本应用

// 声明一个枚举
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT //枚举常量
} 
 
class EnumDemo { 
  public static void main(String args[])  
  { 
    Transport tp; //声明一个Transport引用
 
    tp = Transport.AIRPLANE;    //为tp赋值常量AIRPLANE
 
    // Output an enum value. 
    System.out.println("Value of tp: " + tp); 
    System.out.println(); 
 
    tp = Transport.TRAIN; 
 
    // Compare two enum values. 
    if(tp == Transport.TRAIN)  //比较两个Transport对象是否相等
      System.out.println("tp contains TRAIN.\n"); 
 
    //使用枚举控制switch语句
    switch(tp) { 
      case CAR: 
        System.out.println("A car carries people."); 
        break; 
      case TRUCK: 
        System.out.println("A truck carries freight."); 
        break; 
      case AIRPLANE:  
        System.out.println("An airplane flies."); 
        break; 
      case TRAIN: 
        System.out.println("A train runs on rails."); 
        break; 
      case BOAT: 
        System.out.println("A boat sails on water."); 
        break; 
    } 
  } 
}

value()和valueOf()方法

所有枚举类型自动定义以上两种方法。

public static enum-type[] values()//返回一个枚举常量列表数组
public static enum-type[] valuesOf(String str)//返回一个枚举常量,传递给字符串
// Use the built-in enumeration methods. 
 
// An enumeration of Transport varieties. 
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT 
} 
 
class EnumDemo2 { 
  public static void main(String args[])  
  { 
    Transport tp; 
 
    System.out.println("Here are all Transport constants"); 
 
    // use values() 
    Transport allTransports[] = Transport.values(); 
    for(Transport t : allTransports) 
      System.out.println(t); 
 
    System.out.println(); 
    
    // use valueOf() 
    tp = Transport.valueOf("AIRPLANE"); 
    System.out.println("tp contains " + tp); 
 
  } 
}

构造函数、方法、实例变量和枚举

枚举常量都是一个其枚举类型的对象。

枚举和final共存:枚举适合必须由标识符表示的条目列表的情况;final变量适合于常量值可用于多处地方的情况。

两点限制:枚举不能继承另一个类;enum不能是超类。

// Use an enum constructor, instance variable, and method.  
enum Transport {  
  CAR(65), TRUCK(55), AIRPLANE(600), TRAIN(70), BOAT(22);  
  
  private int speed; // typical speed of each transport   添加一个实例变量
  
  // Constructor  
  Transport(int s) { speed = s; }  
  
  int getSpeed() { return speed; }  //添加一个方法
}  
  
class EnumDemo3 {  
  public static void main(String args[])   
  {  
    Transport tp;  
  
    // Display speed of an airplane.  
    System.out.println("Typical speed for an airplane is " +  
                       Transport.AIRPLANE.getSpeed() +  
                       " miles per hour.\n");  
  
    // Display all Transports and speeds.  
    System.out.println("All Transport speeds: ");  
    for(Transport t : Transport.values())  
      System.out.println(t + " typical speed is " + 
                         t.getSpeed() +  
                         " miles per hour.");  
  }  
}

枚举继承enum

所有枚举都自动继承java.lang.Enum,定义了很多方法,可供所有枚举使用,下面介绍最为常用的两个。

final int ordinal()     //返回枚举常量的顺序值
final int compareTo(enum-type e)    //比较同一个枚举中两个枚举常量的顺序值
// Demonstrate ordinal() and compareTo(). 
 
// An enumeration of Transport varieties. 
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT 
} 
 
class EnumDemo4 { 
  public static void main(String args[])  
  { 
    Transport tp, tp2, tp3; 
 
    // Obtain all ordinal values using ordinal(). 
    System.out.println("Here are all Transport constants" + 
                       " and their ordinal values: "); 
    for(Transport t : Transport.values()) 
      System.out.println(t + " " + t.ordinal()); 
 
    tp =  Transport.AIRPLANE; 
    tp2 = Transport.TRAIN; 
    tp3 = Transport.AIRPLANE; 
 
    System.out.println(); 
 
    // Demonstrate compareTo() 
    if(tp.compareTo(tp2) < 0) 
      System.out.println(tp + " comes before " + tp2); 
 
    if(tp.compareTo(tp2) > 0) 
      System.out.println(tp2 + " comes before " + tp); 
 
    if(tp.compareTo(tp3) == 0) 
      System.out.println(tp + " equals " + tp3); 
  } 
}

为了加深理解,看一个更加具体使用的例子--使用计算机控制交通灯

// A simulation of a traffic light that uses 
// an enumeration to describe the light's color. 
 
// An enumeration of the colors of a traffic light. 
enum TrafficLightColor {  
  RED, GREEN, YELLOW 
} 
 
// A computerized traffic light. 
class TrafficLightSimulator implements Runnable { 
  private Thread thrd; // holds the thread that runs the simulation 
  private TrafficLightColor tlc; // holds the current traffic light color 
  boolean stop = false; // set to true to stop the simulation 
  boolean changed = false; // true when the light has changed
 
  TrafficLightSimulator(TrafficLightColor init) {  
    tlc = init; 
 
    thrd = new Thread(this); 
    thrd.start(); 
  } 
 
  TrafficLightSimulator() {  
    tlc = TrafficLightColor.RED; 
 
    thrd = new Thread(this); 
    thrd.start(); 
  } 
 
  // Start up the light. 
  public void run() { 
    while(!stop) { 
      try { 
        switch(tlc) { 
          case GREEN: 
            Thread.sleep(10000); // green for 10 seconds 
            break; 
          case YELLOW: 
            Thread.sleep(2000);  // yellow for 2 seconds 
            break; 
          case RED: 
            Thread.sleep(12000); // red for 12 seconds 
            break; 
        } 
      } catch(InterruptedException exc) { 
        System.out.println(exc); 
      } 
      changeColor(); 
    }  
  } 
 
  // Change color. 
  synchronized void changeColor() { 
    switch(tlc) { 
      case RED: 
        tlc = TrafficLightColor.GREEN; 
        break; 
      case YELLOW: 
        tlc = TrafficLightColor.RED; 
        break; 
      case GREEN: 
       tlc = TrafficLightColor.YELLOW; 
    } 
 
    changed = true;
    notify(); // signal that the light has changed 
  } 
 
  // Wait until a light change occurs. 
  synchronized void waitForChange() { 
    try { 
      while(!changed) 
        wait(); // wait for light to change 
      changed = false;
    } catch(InterruptedException exc) { 
      System.out.println(exc); 
    } 
  } 
 
  // Return current color. 
  synchronized TrafficLightColor getColor() { 
    return tlc; 
  } 
 
  // Stop the traffic light. 
  synchronized void cancel() { 
    stop = true; 
  } 
}  
  
class TrafficLightDemo {  
  public static void main(String args[]) {  
    TrafficLightSimulator tl =
      new TrafficLightSimulator(TrafficLightColor.GREEN); 
 
    for(int i=0; i < 9; i++) { 
      System.out.println(tl.getColor()); 
      tl.waitForChange(); 
    } 
 
    tl.cancel(); 
  }  
}

相关文章

  • C#枚举及与枚举常数的转换

    1、枚举的定义 2、枚举绑定到comboBox 3、枚举常数转换为枚举string转枚举 数字值转枚举

  • Swift 基础笔记 - 枚举

    枚举 OC定义和使用枚举 Swift定义枚举类型 Swift判断枚举类型 枚举成员类型

  • 枚举类

    1.枚举类型的定义: 枚举类型定义的一般形式为 enum 枚举名{//枚举值表枚举值1;枚举值2;...} 在枚举...

  • 10、枚举与闭包

    枚举 枚举和普通类相比有什么优势 枚举类型、枚举名称与枚举值 枚举的比较运算 两个枚举之间可以使用等值比较(==)...

  • Swift与OC的语法简单对比(常用语法二)

    20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...

  • Swift 2 学习笔记 10.枚举

    课程来自慕课网liuyubobobo老师 枚举 枚举基础 枚举之原始值 枚举之关联值 枚举递归

  • swift3语法(八)

    枚举/结构体 枚举 定义形式enum 枚举名 { 枚举值} // 例如enum CompassPoint {...

  • C语言基础 之 枚举类型

    枚举类型 枚举类型: 列出所有可能的值 枚举类型的定义 枚举类型定义的一般格式:enum 枚举类型名 {枚举值表}...

  • 枚举

    枚举 Why:为什么需要枚举 What:枚举是什么; How:枚举怎么实现 When:枚举什么时候使用 Where...

  • 枚举的概念及应用

    一、枚举的概念 二、枚举类型的定义 三、枚举变量的定义 四、枚举使用的注意 五、枚举变量的基本操作 五、枚举变量的...

网友评论

      本文标题:枚举

      本文链接:https://www.haomeiwen.com/subject/yihbgttx.html