在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在有了枚举,可以把相关的常量分组到一个枚举类型里,这样就很好的阅读性又避免的安全性问题。
枚举的应用:
import java.util.EnumMap;
import java.util.EnumSet;
public enum Gender {
// 利用构造函数传参
MAN(1), WOMAN(2);
// 定义私有变量
private int name;
// 构造函数,枚举类型只能为私有
private Gender(int name) {
this.name = name;
}
@Override
public String toString() {
return String.valueOf(this.name);
}
}
class EnumBiz {
/**
* enum
*/
public static void testEnum() {
System.out.println("枚举类型的遍历 ......");
//获得所有的数据
Gender[] genders = Gender.values();
for (Gender gender : genders) {
System.out.println("name="+gender.name()+"\tordinal="+gender.ordinal()+"\tvalue="+gender);
}
System.out.println();
}
/**
*
* 演示EnumMap的使用,EnumMap跟HashMap的使用差不多,只不过key要是枚举类型
*/
public static void testEnumMap() {
System.out.println("EnmuMap对象的使用.....");
// EnumMap对象的构造函数需要参数传入,默认是key的类的类型
EnumMap<Gender, String> map= new EnumMap<Gender, String>(Gender.class);
//添加数据
map.put(Gender.MAN, "男人");
map.put(Gender.WOMAN, "女人");
//获得所有的数据
for (Gender gender : Gender.values()) {
System.out.println("key="+gender.name()+"\tordinal="+gender.ordinal()+"\tvalue="+map.get(gender));
}
System.out.println();
}
/**
*
* EnumSet如何使用,EnumSet是一个抽象类,获取一个类型的枚举类型内容
* 可以使用allOf方法
*/
public static void testEnumSet() {
System.out.println("EnmuSet对象的使用.....");
// EnumMap对象的构造函数需要参数传入,默认是key的类的类型
EnumSet<Gender> set= EnumSet.allOf(Gender.class);
//获得所有的数据
for (Gender gender : set) {
System.out.println(gender);
}
System.out.println();
}
}
测试:
public class TestGender {
public static void main(String[] args) {
EnumBiz.testEnum();
EnumBiz.testEnumMap();
EnumBiz.testEnumSet();
}
}
显示效果:
总结:
1、java enum类中为什么构造器必须是私有的?
枚举被设计成是单例模式,即枚举类型会由JVM在加载的时候,实例化枚举对象,你在枚举类中定义了多少个就会实例化多少个,JVM为了保证每一个枚举类元素的唯一实例,是不会允许外部进行new的,所以会把构造函数设计成private,防止用户生成实例,破坏唯一性