您的位置:首页 > 职场人生

嘿牛程序员__成都传智博客__枚举的一个带参构造函数的实现——以交通灯的转换为例

2012-06-14 01:59 330 查看
---------------------- android培训java培训、期待与您交流! ----------------------

 



枚举
一、简介

枚举,相当于定义了一个类。只是这个类有点特殊。它默认继承java.lang.Enum类。此类实现了Comparable和Serializable两个接口,证明枚举类型可以使用比较器和序列化操作。

2、枚举类的主要操作方法

protected Enum(String name,int ordinal)单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。

public final String name()返回此枚举常量的名称,在其枚举声明中对其进行声明。 与此方法相比,大多数程序员应该优先考虑使用toString() 方法,因为 toString 方法返回更加用户友好的名称。该方法主要设计用于特殊情形,其正确性取决于获取正确的名称,其名称不会随版本的改变而改变。

public final int ordinal()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。

public String toString()返回枚举常量的名称,它包含在声明中。可以重写此方法,虽然一般来说没有必要。当存在更加“程序员友好的”字符串形式时,应该使用枚举类型重写此方法。

public final boolean equals(Object other)当指定对象等于此枚举常量时,返回 true。

public final int hashCode()返回枚举常量的哈希码。

protected final Object clone() throws CloneNotSupportedException抛出 CloneNotSupportedException。这可保证永远不会复制枚举,这对于保留其“单元素”状态是必需的。

public final int compareTo(E o)比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)

3、实现

对于无参的构造方法,引用比较简单。本程序主要解决带有参数的构造函数:因为枚举类的构造函数是私有的,所以不能被外部调用。所以它主要用于程序体内的初始化。

例题:程序要求实现交通灯的转换,并给出set、get方法用于设置转换时间。

//枚举类

package javahigh;

public enum TrafficLamp {

    /**

     * 本程序主要实现交通灯转换,并输出转换所用的时间

     * 程序给出一个交通灯转换函数(抽象)public abstract TrafficLamp nextLamp(),并通过内部类来实现

     * 程序给出一个带有参数的构造函数:private TrafficLamp(long  time),用它来获取初始时间。

     * 程序给出一个交通灯停顿的函数:public  void getStop()

     * 为了方面用户设置自己想要的时间,程序给出了set\get方法

     *

     * */

     RED(2) {

   @Override

   public TrafficLamp nextLamp() {

    // TODO Auto-generated method stub

    System.out.println("红灯转绿灯,等待时间为"+getTime()+"秒");

    getStop();

    return GREEN;

   }

  },

  GREEN(2) {

   @Override

   public TrafficLamp nextLamp() {

    // TODO Auto-generated method stub

    System.out.println("绿灯转黄灯,等待时间为"+getTime()+"秒");

    getStop();

    return YELLOW;

   }

  },

  YELLOW(1) {

   @Override

   public TrafficLamp nextLamp() {

    // TODO Auto-generated method stub

    System.out.println("黄灯转红灯,等待时间为"+getTime()+"秒");

    getStop();

    return RED;

   }

  };

     public abstract TrafficLamp nextLamp();

  private long time;

  private TrafficLamp(long  time) {

      this.time=time;

     }

  public void setTime(long time) {

        this.time = time;

    }

  public long getTime() {

      return time;

     }

  public  void getStop() {

      try{

       Thread.sleep(1000*time);

       }catch(
a3e7
Exception e){

        System.out.println(e.getMessage());

       }

     }

}

//测试类

package javahigh;

public class TestTrafficLamp {

 public static void main(String[] args) {

  // TODO Auto-generated method stub

  //遍历所有有枚举值,用到values()方法

  for(TrafficLamp t:javahigh.TrafficLamp.values())    

   System.out.println("交通灯 value:"+ t);

  //获得某个枚举的值,用到valueOf(String类型)

  System.out.println(javahigh.TrafficLamp.valueOf("RED").toString());

  //调用枚举类,因为枚举类是一个抽象类,所以不能实例化(TrafficLamp tr=new TrafficLam;)

  //只能通过访问的形式去调用(TrafficLamp tr=TrafficLamp.枚举对象;)

  TrafficLamp trafficLamp1=javahigh.TrafficLamp.RED;

  //测试并输出枚举对应的值

    System.out.println(trafficLamp1.name());

    //设置停顿 的时间

    trafficLamp1.setTime(3);

    //执行交通灯交换

    trafficLamp1.nextLamp();

  TrafficLamp trafficLamp2=javahigh.TrafficLamp.GREEN;

    trafficLamp2.setTime(3);

    trafficLamp2.nextLamp();

  TrafficLamp trafficLamp3=javahigh.TrafficLamp.YELLOW;

    trafficLamp3.setTime(2);

    trafficLamp3.nextLamp(); 

 } 

}



---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐