今天总结一下枚举类型的使用,先来看一个需求,现在我想模拟交通信号灯的功能,在实现这个功能之前,我要先解决用什么方式表示信号灯中的红黄绿三个数值,我先用简单的方法实现一下:
public class Demo1 {
public static void main(String[] args) {
int color;
color = Color.GREEN;
}
}
class Color{
public static final int RED = 1;
public static final int GREEN = 2;
public static final int YELLOW = 3;
}
这个方法里我定义了一个类,里面定义了三个整形常量,在使用的时候只需要定义三个变量即可,但是这里有一个问题,因为是用整形表示红绿灯的,所以如果给color赋值为其它整形的话,程序不会报错,但是它的功能就不能实现了,咱们要的是只能让color取红黄绿中的一种值,不能是其它的值,咱们再来看看第二种方法:
public class Demo2 {
public static void main(String[] args) {
Color color = Color.GREEN;
}
}
class Color{
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color YELLOW = new Color();
}
这里也定义了一个类,类里面的参数变成了这个类的实例对象,在定义信号灯颜色的时候可以定义这个类的实例对象color,然后给这个对象赋值,赋的值也是Color的对象,这样就可以保障color的值只能是Color的对象,这样写比第一种方法好一点,但是这样还有一个问题,就是我可以直接new一个对象赋给color啊,这样就保障不了它的取值范围是红黄绿三种中的一个,怎么解决呢?这里只需要在Color类中让它的无参构造方法私有化即可,代码如下:
class Color{
private Color2(){}
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color YELLOW = new Color();
}
这样写就不能自己new一个对象了,可以保证信号灯取值的正确性了,但是这样写有点麻烦,如果变量很多的话要定义很多常量对象,有什么简单一点的方法呢?有,jdk5.0提供了枚举类型,它简化了上面第二种写法,对于Color可以这样写:
enum Color{
RED,GREEN,YELLOW;
}
直接写上需要的常量,这三个常量其实就是Color的实例化对象,它的本质和方法二是一样的,枚举里面的无参构造函数也是私有化的,但是咱们可以重写它,然后给他传递一个参数,这样可以验证这三个常量到底是什么类型的:
enum Color{
RED("red"),GREEN("green"),YELLOW("yellow");
private Color4(String name){}
}
上面的代码给Color加了一个有参数的构造函数,这时候就不能直接写三个常量了,必须在后面写上传递的参数才不会报错,这说明三个常量其实就是Color的实例对象。如果再给这个枚举类加上一个抽象方法的话,三个常量也必须实现这个抽象方法:
enum Color{
RED("red"){
public void p(){
System.out.println("red");
}
},GREEN("green"){
public void p(){
System.out.println("green");
}
},YELLOW("yellow"){
public void p(){
System.out.println("yellow");
}
};
private Color(String name){}
public abstract void p();
}
实现抽象方法的方式如上面代码所写,这更加说明了枚举类型的实质就是我在第二种方法里写的代码,常量实质就是这个类的实例化对象。下面看一下枚举的其它简单操作:
public class Dome4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Color5 color = Color.RED;
//获取color常量的名称
String name = color.name();
System.out.println(name);
//获取常量的位置
int index = color.ordinal();
System.out.println(index);
//获取常量的位置
Color5 c = color.valueOf("GREEN");
System.out.println(c.ordinal());
}
}
enum Color{
RED,GREEN,YELLOW;
}
上面的代码演示了如何获取常量的名称和如何获取枚举类型的常量以及获取常量的位置。以上就是对枚举的简单的总结