目录
什么是枚举?
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
多例模式的类:
首先我们写一个多例模式的类:
/**
* Create by ZwZ
* DateTime:2018/10/25 16:50
* Description :多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
*/
//枚举类
public class Season {
private final String name;//季节名字
private final String desc;//季节描述
//私有化构造方法
private Season(String name,String desc){
this.name = name;
this.desc = desc;
}
//向外界提供得到属性的方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
//创建枚举类的对象(用全大写表示常量)
public static Season SPRING = new Season("spring","春暖花开");
public static Season SUMMER = new Season("summer","夏日炎炎");
public static Season AUTUMN = new Season("autumn","秋高气爽");
public static Season WINTER = new Season("winter","白雪茫茫");
}
其中需要说明的就是:
以上这个类其实就可以看成一个枚举类,它用来给外界提供有限的对象;
其属性进行私有化就是一个封装的思想,使得其他类只能通过set方法对属性进行修改,而不是直接就可以进行更改。而这里没有set方法,因为我们这里写的是枚举类,是不希望其他类使用Season对象的时候对这些对象的属性进行修改的,所以使用final进行修饰;
其构造方法必须进行私有化,否则的话在其他类中可以new出来Season对象,所以这个多例模式就没有什么存在的意义了;
在此类中创建对象,用于其他类通过这个类拿到其特定的(枚举出来的)对象。所以要使用static修饰,而因为此对象的属性都是不可以修改的,可以理解成常量,所以取名字的时候使用全部大写的形式(完全可以不使用,但是这是一个代码规范问题)。
以上就写成了一个枚举类,用户只能通过这个类来得到特定的,有限的,对象。下面我们写一个测试类对其进行使用:
public class Test1 {
public static void main(String[] args) {
Season spring = Season.SPRING;
String name = spring.getName();
String desc = spring.getDesc();
System.out.println(name + "" + desc);
}
}
控制台打印输出的信息如下:
这便是枚举类的用法。如果我们在Test1的main方法中加上下面的代码:
Season season = new Season("四季如春","这是一个好的季节");
就会报错:
'Season(java.lang.String, java.lang.String)' has private access in 'enumDemo.Season'
也就是说,,构造方法被私有化了。在Test1这个类中是不能对其进行new的。
枚举类的使用:
上边我们已经看到了一个多例模式下的枚举类的书写方法。但是是比较麻烦的,在JDK5之后就提出了一个新的关键字:enum,专门来进行枚举类的构建。下面我们使用enum写一个和上边那个Season类有一模一样功能的类:
/**
* Create by ZwZ
* DateTime:2018/10/25 16:46
* Description : how to use enum?
*/
public enum SeasonEnum {
//在枚举类中规定,必须放在类的最前面 默认被public static修饰
SPRING("spring","春暖花开"),
SUMMER("summer","夏日炎炎"),
AUTUMN("autumn","秋高气爽"),
WINTER("winter","白雪茫茫");
private final String name;//季节名字
private final String desc;//季节描述
private SeasonEnum(String name,String desc){
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
以上这个类,在功能上是和Season一样的。以上类中的SPRING,SUMMER,AUTUMN,WINTER都是SeasonEnum类的对象,并且由public static进行修饰。其实使用enum修饰的SeasonEnum,在编译后也是会成为类似Season形式的类。但是这个是程序员不用操心的,你只管去使用就好。
关于枚举类型的几点总结:
1.枚举像一个类,又像一个数组
2.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例
3.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。