枚举,泛型

 经常会需要一些只拥有一个预定义的固定序列值的变量。例如,假设要用名字weekday定义一个整型变量,用于存储一个代表一周中某一天的整形值。在理 想情况下,该变量需要限制在七个可能值中,即周一到周日中的某一个。在这种情况下,一个很自然的选择是使用一个称作【枚举(enumeration(】的 工具。对于上面的情况可以使用下列声明语句定义一个枚举:
        
    enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
    
该 语句为变量定义了一个新的类型Day,变量中只可以存储大括号中指定的某一个值。名字Monday、Tuesday……一直到Sunday都成为【枚举值 (enumeration constant)】,它们确定了Day型变量的取值范围。实际上,这些枚举值将于整数值相对应,但它们用不同于整型变量。
    
    在类型名Day的开头使用的大写字母D,1/是因为习惯上自定义的类型都是以大写字母开头。通常枚举值的名字都被写成小写字母开头。
        
    有了这个新的类型,就可以相下面这样【定义weekday变量】了:
    Day weekday = Day.Tuesday;
    该语句声明了变量Day型变量weekday,并用值Tuesday对其进行初始化。
    
    【注意1:】这里使用的枚举值必须限定在它所在的枚举类型名范围内。如果不再该范围内,编译器讲不能够识别出这个值。对一个已知枚举类型变量的设置,只能使用该类型中定义
    
    【注意3:】在Java 1.5以前,Switch语句只能和int, short, char以及byte这些数据类型联合使用。现在,在Java 1.5的枚举中,你也可以方便的使用switch 语句了。比如:

【一、概述】
    枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。
    
    枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值, 而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。
    
【二、枚举类型的实现】
    switch语句的条件只能接收数值或字符(byte、short、int或char)或枚举(enum)类型的变量名或表达式。
    /**
 * @author wanghengyuan
 * Date:
 * Time:
 * 狙击手活动(枚举类型实现) *
 */
public enum SharpShooter {
    locked,            // 锁定
    aim,            // 瞄准
    shoot            // 射击
}
/**
 * @author wanghengyuan
 * Date:
 * Time:
 * 测试普通枚举类型
 */
public class TestDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestDemo test = new TestDemo();
        
        test.doAction(SharpShooter.locked);
        test.doAction(SharpShooter.aim);
        test.doAction(SharpShooter.shoot);
    }
    
    /**
     * 执行的动作
     */
    public void doAction(SharpShooter action) {
        switch(action) {
        case locked:
            System.out.println("1:锁定目标");
            break;
        case aim:
            System.out.println("2:瞄准目标");
            break;
        case shoot:
            System.out.println("3:射击");
            break;
        default:
            System.out.println("*:游戏还没有定义此功能!");
        }
    }

}
【三、枚举类型的实质】
 
在编译SharpShooter_2.java后,会生成一个SharpShooter_2.class文件,这说明枚举类型的实质还是一个类。因此,在某种程度上,enum关键字的作用就是class或者interface。
 
当使用enum定义一个枚举类型时,实际上所定义的类型自动继承了java.lang.Enum类。而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。
 
在 查询JDK1.5文档的java.lang.Enum类,里面清楚的说明:java.lang.Enum类是所有 Java 语言枚举类型的公共基本类。因此,所有枚举类型都拥有有java.lang.Enum类所提供的共有方法。因此,要学会使用枚举,还必须认识 java.lang.Enum类。下面将详细说明。

【四、java.lang.Enum类】

【五、枚举的高级用法】
 
1、枚举方法
 
既然枚举的本质是类,那么定义枚举类型时也可以定义方法。比如:
/**
 * @author wanghengyuan
 * 带方法的枚举类型
 */
public enum SharpShooter {
    locked, aim, shoot;
    
    public String getEnumCons() {
        switch(this.ordinal()) {
        case 0:
            return "锁定目标";            
        case 1:
            return "瞄准目标";            
        case 2:
            return "射击";            
        default:
            return "没有此索引值";
        }
    }
}

/**
 * @author wanghengyuan
 * 测试枚举方法
 */
public class TestDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for (SharpShooter enumCons : SharpShooter.values()) {
            System.out.println(enumCons.getEnumCons());
        }
    }
}

2、枚举构造方法
    
/**
 * @author wanghengyuan
 *    带私有构造方法的枚举类型
 */
public enum SharpShooter {
    locked("锁定目标"), aim("瞄准目标"), shoot("射击");
    
    /**
     * 私有的构造方法
     */
    private SharpShooter(String desc) {
        this.desc = desc;
    }
    
    /**
     * 获取枚举值的说明
     * @return String
     */
    public String getDesc() {
        return desc;
    }
    
    // Private variables
    private String desc;
}

/**
 * 测试带私有构造方法的枚举类型
 * @author wanghengyuan
 *
 */
public class TestDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for (SharpShooter enumCons : SharpShooter.values()) {
            System.out.println(enumCons + ": " + enumCons.getDesc());
        }
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值