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

---------------------- 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(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值