A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海刚 黑马帝   /  2011-7-29 20:35  /  2295 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。

请问枚举带来的方便性在那里 ?  谢谢

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 建议多看看视频!

查看全部评分

5 个回复

倒序浏览
黑马网友  发表于 2011-7-29 21:55:12
沙发
最简单最重要的就是固定取值
回复 使用道具 举报
黑马网友  发表于 2011-7-29 22:24:22
藤椅
枚举的特点:
1.具有数据安全性,出现枚举定义之外的值会报错
2.紧凑有效的枚举数值定义
3.无缝的和程序其他部分的相互操作,被switch-case支持
4.运行的效率高

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1

查看全部评分

回复 使用道具 举报
一个类的对象是有限的而且是固定的、比如季节,有四个对象、这种实例有限而且固定的类,我们可以定义成Java类里的枚举类

比如我们不使用enum来创建而是自己定义一个枚举类:
下面定义一个Season类,这个类只能产生四个对象[code=java]package cn.itcast.heima
public class Season
{
        //把Season类定义成不可变的,将其属性也定义成final
        private final String name;
        private final String desc;
        public static final Season SPRING = new Season("春天" , "趁春踏青");
        public static final Season SUMMER = new Season("夏天" , "夏日炎炎");
        public static final Season FALL = new Season("秋天" , "秋高气爽");
        public static final Season WINTER = new Season("冬天" , "围炉赏雪");

        public static Season getSeaon(int seasonNum)
        {
                switch(seasonNum)
                {
                        case 1 :
                                return SPRING;
                        case 2 :
                                return SUMMER;
                        case 3 :
                                return FALL;
                        case 4 :
                                return WINTER;
                        default :
                                return null;
                }
        }

        //将构造器定义成private访问权限
        private Season(String name , String desc)
        {
                this.name = name;
                this.desc = desc;
        }
        //只为name和desc属性提供getter方法
        public String getName()
        {
                 return this.name;
        }
        public String getDesc()
        {
                 return this.desc;
        }
}[/code]上面定义一个不可变类,包含了四个static final常量属性,这四个常量属性表示这个类能创建的对象,当其他程序使用Season对象的时候,既可以通过Season.SPRING方式取得,也可通过getSeason静态工厂方法来获得,
下面程序示范了如何使用上面定义的类[code=java]package cn.itcast.heima
public class TestSeason
{
        public TestSeason(Season s)
        {
                System.out.println(s.getName() + ",这真是一个"+ s.getDesc() + "的季节");
        }
        public static void main(String[] args)
        {
                //直接使用Season的FALL常量代表一个Season对象
                new TestSeason(Season.FALL);
        }
}[/code]更早以前我们还会这样定义枚举:[code=java]public static final int SEASON_SPRING = 1 ;
public static final int SEASON_SUNMER= 2 ;
public static final int SEASON_FALL= 3 ;
public static final int SEASON_WINTER= 4 ;[/code]注:这种定义简单但是有问题:
1、类型不安全:因为上面每个季节实际是一个int整数,因此完全可以把一个季节当成一个int整数使用,而且他们之间还能相加
2、没有命名空间:当需要使用季节的时候,必须在SPRING前面使用SEASON_前缀,否则程序可能与其他类中的静态常量混淆,
3、打印输出意义没有明确:当我们打印输出某个季节的时候,比如SEASON_SPRING ,实际上书输出1.但是这个1很难让程序员猜测它代表春天
不管是上面两种方式的任何一种,他们在实现时候是有意义的,但是手动实现的时候代码量很大,实现起来也比较麻烦,如过使用枚举关键字来定义则相对简单如下
而使用Java中的enum来定义枚举类[code=java]public enum SeasonEnum
{
        SPRING,SUMMER,FALL,WINTER;
}[/code]使用枚举类:[code=java]package cn.itcast.heima
public class TestEnum
{
        public void judge(SeasonEnum s)
        {
                //switch语句里的表达式可以是枚举值
                switch (s)
                {
                        case SPRING:
                                System.out.println("春暖花开,正好踏青");
                                break;
                        case SUMMER:
                                System.out.println("夏日炎炎,适合游泳");
                                break;
                        case FALL:
                                System.out.println("秋高气爽,进补及时");
                                break;
                        case WINTER:
                                System.out.println("冬日雪飘,围炉赏雪");
                                break;
                }
        }
        public static void main(String[] args)
        {
                //所有枚举类都有一个values方法,返回该枚举类的所有实例
                for (SeasonEnum s : SeasonEnum.values())
                {
                        System.out.println(s);
                }
                new TestEnum().judge(SeasonEnum.SPRING);
        }
}[/code]从上面可我们可以看出,使用ENUM关键字定义枚举类不仅实现起来很方便,而且更具有实际的意义
[ 本帖最后由 詹季春 于 2011-07-29  22:44 编辑 ]

评分

参与人数 1技术分 +3 收起 理由
小龙 + 3 加分必须的,答问题就得像你这样,尽量把代

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 08:45:54
报纸

回复 板凳 的帖子

每看一个 你的回答 都能学到 很多东西。。 写的很详细,还有代码
回复 使用道具 举报
黑马网友  发表于 2011-7-31 14:25:13
地板
看的出来是个细心的男人
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马