枚举类的用法讲解
本文为博主原创,未经允许不得转载
在应用中,需要配置很多常量类的属性,在业务应用中获取同一类常量属性的时候,有很多中方法,
一种是将常量类属性放在properties文件当中,在加载的时候进行加载,获取时可以一个一个获取,也可以同时
获取到一个集合,还有一种是将同一类的属性放在枚举类中,在后台业务中进行操作时,会更加的方便快捷。
枚举类的关键字为enum,以下为一个枚举类:
package com.test;
//所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
//enum这个关键字,可以理解为跟class差不多,这也个单独的类。
//可以看到,上面的例子里面有属性,有构造方法,有getter,也可以有setter,
//但是一般都是构造传参数。还有其他自定义方法。那么在这些东西前面的,以逗号隔开的,最后以分号结尾的,
//这部分叫做,这个枚举的实例。也可以理解为,class new 出来的实例对象。这下就好理解了。
//只是,class,new对象,可以自己随便new,想几个就几个,而这个enum关键字,他就不行,他的实例对象,
//只能在这个enum里面体现。也就是说,他对应的实例是有限的。这也就是枚举的好处了,限制了某些东西的范围,
//举个栗子:一年四季,只能有春夏秋冬,你要是字符串表示的话,那就海了去了,但是,要用枚举类型的话,
//你在enum的大括号里面把所有的选项,全列出来,那么这个季节的属性,对应的值,只能在里面挑。不能有其他的。
public enum Color { // 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 RED("红色", 1),GREEN("绿色", 2),BLANK("白色", 3),YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 ,强制私有!!! // 枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。 private Color(String name, int index) { this.name = name; this.index = index; } // 用法三:向枚举中添加新方法 public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
当枚举类中含有抽象方法的时候,每一个枚举的对象都需要实现抽象方法,因为枚举类不能继承其他类,也不能被其他类继承。
有抽象方法的类必然是抽象类,抽象类就需要子类继承它然后实现它的抽象方法,但是呢,枚举类不能被继承,所以需要每一个枚举
的对象都实现抽象方法。
代码如下:
package com.test; public enum Color { // 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 RED("红色", 1) { @Override public String getType() { // TODO Auto-generated method stub return "红色"; } },GREEN("绿色", 2) { @Override public String getType() { // TODO Auto-generated method stub return "绿色"; } },BLANK("白色", 3) { @Override public String getType() { // TODO Auto-generated method stub return "白色"; } },YELLO("黄色", 4) { @Override public String getType() { // TODO Auto-generated method stub return "白色"; } }; // 成员变量 private String name; private int index; // 构造方法 ,强制私有!!! // 枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。 private Color(String name, int index) { this.name = name; this.index = index; }
/*
*抽象方法
*/ public abstract String getType(); // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
枚举要注意的细节:
1. 枚举类也是一个特殊的类。
2. 枚举值默认的修饰符是public static final。
3. 枚举值的数据类型就是枚举值所属的类的类型, 然后枚举值是指向了本类的对象的。
4. 枚举类的构造方法默认的修饰符是private的,私有构造方法后,外界就不能创建该类的对象了。
5. 枚举类可以定义自己的成员变量与成员函数。
6. 枚举类可以自定义构造函数,但是构造函数的修饰符必须是private。
7. 枚举类可以存在抽象 的方法,但是枚举值必须要实现抽象 的方法。
8. 枚举值必须要位置枚举类 的第一个语句。