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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹昌豪 中级黑马   /  2012-5-28 12:37  /  1754 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

枚举也比较重要的啊,感觉有点迷糊,刚开始看,怎么具体理解??

5 个回复

倒序浏览
本帖最后由 黑马-唐磊 于 2012-5-28 12:56 编辑

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。如果要定义星期几或性别的变量还有张孝祥老师讲的定义多个交通灯的类型和银行调度系统定义多个不同窗口就要使用到枚举,枚举就是让某个类型的变量取值只为若干个固定值中的一个,否则编译就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通的变量方式在开发阶段无法实现这一目标,先面试枚举一些特性
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。

4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.

5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);

2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

public enum Color {
Red,
Green,
Blue;


private static int number = Color.values().length ;


public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}



可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。


3.覆载(Override)toString, valueOf方法。
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。

….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";

}
}
….

这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

4.使用构造函数。
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。


public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");

private String desc;

Color(String desc){
this.desc = desc;
}

public String getDesc(){
return this.desc;
}

}

这里我们为每一个颜色提供了一个说明信息
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}

};
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
枚举是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
public enum Season {
        winter, spring, summer, fall;
}
表示Season(季节)的值只能是枚举里面定义的   winter, spring, summer, fall(春夏秋冬);
回复 使用道具 举报
定义枚举枚举实现单例模式:
public enum TrafficLamp {
        RED(30) {
            public TrafficLamp nextLamp() {
                return GREEN;
            }
        },
        GREEN(45) {
            public TrafficLamp nextLamp() {
                return YELLOW;
            }
        },
        YELLOW(3) {
            public TrafficLamp nextLamp() {
                return RED;
            }
        };
        public abstract TrafficLamp nextLamp();
        private int time;
        private TrafficLamp(int time){this.time = time;}
    }
回复 使用道具 举报
个人觉得枚举的用法多看看视频就能学到,但得去深思它的用意及其使用场所;  枚举:是程序在编译时,让某个类型的变量的值只能为若干个固定值中的一个; 例如:张老师讲解的交通灯管理系统中,   就给Lamp规定了十二个方向,这样用起来方便多了;   日常生活中用到枚举的地方还有很多,如:一周有七天,还有交通灯信号, 用枚举简单明了 ;   特别注意的 是,当枚举只有一个对象时, 用作单例最好不过了;   
回复 使用道具 举报
枚举主要用于某些有特定意义的东西,比如星期、方向等等。
还可以防止用户的非法输入。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马