java中除了类和接口,还有一个类型叫做枚举(enum),它出现得比较晚,在JDk1.5之后才出,因此对我们来说并不常用,但是它的作用还是不小。
创建的时候前面和创建类、接口一样,在new之后,我们选择enum即可。表面上枚举和类,接口的区别是它是用enum修饰的,在图标上是个黄色的E。
至于内部上的区别,我个人认为枚举主要是将基本类型和值的限制进行了一个封装。枚举,根据字面的意思就是一一举例,那么我觉得就是可以封装进去一些已知所有结果的值。我们可以将它用作常量的封装。
首先我们来定义一个枚举,将周一到周日封装进去:
- public enum Week {
- MON,TUE,WED,THU,FRI,SAT,SUN
- }
如果我们要使用它的,直接调用即可,比如说我想调用星期一:
- public class Test {
- public static void main(String[] args) {
- Week week = Week.MON;
- System.out.println(week);
- }
- }
然后,我们还可以直接用在switch里面:
- public static void main(String[] args) {
- Week week = Week.MON;
- switch (week) {
- case MON:
- break;
- case TUE:
- break;
- case WED:
- break;
- case THU:
- break;
- case FRI:
- break;
- case SAT:
- break;
- case SUN:
- break;
- default:
- break;
- }
- }
当然我们也可以用for each遍历枚举:
- public static void main(String[] args) {
- Week week = Week.MON;
- for (Week w : week.values()) {
- System.out.println(w);
- }
- }
讲了这么多,有童鞋可能会问了,那我直接在外面写七个String类型的变量就可以了,干嘛非要用什么枚举,还这么麻烦?
- 我们的java代码提倡 高内聚,低耦合的设计理念,通俗来讲,就是一段代码,能封装就封装,能复用就复用,尽量不要让同样的一段逻辑在程序中出现多次。比如这个星期,我们可能在这个类里面要用到,也可能要在别的类里面用到,那么我们只需要写一个枚举,这样在别的类用的时候也是如此调用就好了。这样做的好处是,如果哪一天,我们要改什么需求,只需要在枚举里面改一下就好了,如果程序没有符合这个理念,不仅改起来非常麻烦,还容易出错。
接下来讲讲稍微高级点的玩法:
- public enum Week {
- MON("星期一"),TUE("星期二"),WED("星期三"),THU("星期四"),FRI("星期五"),SAT("星期六"),SUN("星期日");
- private String week;
- private Week(String week){
- this.week = week;
- }
- public String getWeek() {
- return week;
- }
- }
- public class Test {
- public static void main(String[] args) {
- Week week = Week.MON;
- for (Week w : week.values()) {
- System.out.println(w.getWeek());
- }
- }
- }
如果我们加入有参构造函数还有getter方法,加入一个值起名叫做week,便可以获取这个值里面的实际内容,运行,再运行结果就是:
除了加一个,我们还可以加多个,比如给每个星期的值加上一个下标:
- public enum Week {
- MON("星期一",0),TUE("星期二",1),WED("星期三",2),THU("星期四",3),FRI("星期五",4),SAT("星期六",5),SUN("星期日",6);
- private String week;
- private int index;
- private Week(String week, int index){
- this.week = week;
- this.index = index;
- }
- public String getWeek() {
- return week;
- }
- public int getIndex(){
- return index;
- }
- }
当然,我们也可以加入setter方法,这个函数可以用来修改枚举里面的内容,比如我们用getter方法拿到index为0的参数,我们把再用setter方法讲将此参数内的weeb值修改,这个有兴趣的话可以自己试验一下。 枚举还有更多用法,比如可以继承类还有实现接口,有兴趣可以自己查查,在这不做重点。