java枚举解析
2016-05-09 16:21
411 查看
今天总结一下枚举类型的使用,先来看一个需求,现在我想模拟交通信号灯的功能,在实现这个功能之前,我要先解决用什么方式表示信号灯中的红黄绿三个数值,我先用简单的方法实现一下:
这个方法里我定义了一个类,里面定义了三个整形常量,在使用的时候只需要定义三个变量即可,但是这里有一个问题,因为是用整形表示红绿灯的,所以如果给color赋值为其它整形的话,程序不会报错,但是它的功能就不能实现了,咱们要的是只能让color取红黄绿中的一种值,不能是其它的值,咱们再来看看第二种方法:
这里也定义了一个类,类里面的参数变成了这个类的实例对象,在定义信号灯颜色的时候可以定义这个类的实例对象color,然后给这个对象赋值,赋的值也是Color的对象,这样就可以保障color的值只能是Color的对象,这样写比第一种方法好一点,但是这样还有一个问题,就是我可以直接new一个对象赋给color啊,这样就保障不了它的取值范围是红黄绿三种中的一个,怎么解决呢?这里只需要在Color类中让它的无参构造方法私有化即可,代码如下:
这样写就不能自己new一个对象了,可以保证信号灯取值的正确性了,但是这样写有点麻烦,如果变量很多的话要定义很多常量对象,有什么简单一点的方法呢?有,jdk5.0提供了枚举类型,它简化了上面第二种写法,对于Color可以这样写:
直接写上需要的常量,这三个常量其实就是Color的实例化对象,它的本质和方法二是一样的,枚举里面的无参构造函数也是私有化的,但是咱们可以重写它,然后给他传递一个参数,这样可以验证这三个常量到底是什么类型的:
上面的代码给Color加了一个有参数的构造函数,这时候就不能直接写三个常量了,必须在后面写上传递的参数才不会报错,这说明三个常量其实就是Color的实例对象。如果再给这个枚举类加上一个抽象方法的话,三个常量也必须实现这个抽象方法:
实现抽象方法的方式如上面代码所写,这更加说明了枚举类型的实质就是我在第二种方法里写的代码,常量实质就是这个类的实例化对象。下面看一下枚举的其它简单操作:
上面的代码演示了如何获取常量的名称和如何获取枚举类型的常量以及获取常量的位置。以上就是对枚举的简单的总结
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; }
上面的代码演示了如何获取常量的名称和如何获取枚举类型的常量以及获取常量的位置。以上就是对枚举的简单的总结
相关文章推荐
- spring 注解
- dubbo入门介绍及结合spring搭建(源码放送)
- JavaEE中struts2实现文件上传下载功能实例解析
- Spring-JDBC通用Dao
- Java:类与继承
- 生产者/消费者问题java实现
- Kafka使用Java客户端进行访问
- 什么是对象?
- Java 新I/O 通道和缓冲器
- 九龙_Java开发之路_1
- Java基础9
- Java异常
- Java设计模式 · 观察者模式
- java动态绑定在属性和方法上的不同
- Java Reflection(十二):动态类加载与重载
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- Spring中depends-on的作用是什么?
- 深入Java集合学习系列:ArrayList的实现原理
- SpringMVC接收checkbox传值
- spring整合消息队列rabbitmq