-
自第五版本引入。
-
亦一种类尔,但使用enum声明创建此类,亦可使用构造、属性、方法,可实现零或多接口,但无法实现继承,即无有子类。
-
枚举类型不可通过new创建可用实例,语法约束所在。
-
永为单例,枚举无法使用new创建,且无法反射,即实现最终极的单例效果。且对序列化做优化处理,可防止于序列化中创建新对象,一称反序列化。
-
枚举类中可使用全大写单词创建多个“元素”,这些元素将代表当前枚举类实例所用,此元素代表实例,外部无法手动创建故称单例,但多个元素之间不为一例。亦曰,枚举类之实例可有元素控制个数,各枚举元素不可外部复制获得。
-
所有的枚举类将默认继承Enum类,并从中获得非私有方法,但不可直接手写,只能默认。
-
枚举类中可存在构造,可对类中各元素进行控制(因各元素皆为此类之实例),且只能使用private私有修饰。
创建枚举类
-
枚举有enum关键字创建,其中直接可书写全大写枚举元素。
-
如果只存在单个枚举元素,可忽略前后分号。但若枚举元素后存在其他成员,即要添加分号分隔。
-
单个枚举中可存在多个枚举元素,多个元素使用逗号隔开,最后一个元素后加分号。
-
枚举类中的单个或一组元素的声明要放在枚举类首位,其他成员之上,此为语法所限制。
public enum Color{ BLACK }
public enum Color{ BLACK;//当存在其他成员,元素要在首位 public String ColorName = "彩色"; }
public enum Color{ BLACK,RED,GREEN; }
-
枚举中,各元素皆代表其实例,枚举类之中构造皆为各元素构造,若书写构造为有参则默认构造消失,只可使用其有参构造,即要在各元素中对其进行传值创建,但传入参数不可对元素中内容进行操作:
public enum TestEnum{ ONE("1"),TWO("2"); private TestEnum(String en){} }
使用枚举类
-
可在外部直接调用枚举类中某元素进行输出,实则输出其toString方法,为当前枚举类元素名。
public class Main{ public static void main(String[] args){ System.out.println(Color.BLACK);//BLACK } }
-
此处元素所调用的toString方法即Enum所有,因所有枚举类皆继承于此类。此类中toString方法为返回当前实例之name属性,为String类型,即对象之名。
public abstract class Enum<E extends Enum<E>>{ private final String name; public String toString(){ return name; } }
-
枚举类中各个元素都代表其实例,此实例继承抽象类Enum可获得其普通方法,间接可获得所有Object中的非私有方法。
方法名 作用 name() 与toString相同,获得其名称 ordinal() 获得序号,从0开始,表示元素顺序 valueOf() 传入元素名称,获得其实例,实则可以直接通过元素名获得 getDeclaringClass() 返回此元素所在枚举类 getClass() 同样与getDeclaringClass相同,获取其枚举类,但在某情况下会出现差别
-
在switch中可传入枚举值进行判断输出:
public enum TestEnum{ ONE,TWO; } public class Main{ public static void main(String[] args){ choice(TestEnum.ONE); } public static void choice(TestEnum e){ switch(e){ case ONE: ...; break; case TWO: ...; break; } } }
-
枚举元素皆继承父Enum类,其父Enum存在有参构造方法可对单个元素赋值。但无法手动调用,只可在编译时自动赋值所用。
-
/* 1. 创建一枚举类型且创建两元素。 2. 创建全局属性,使各个元素均拥有。 3. 对构造方法进行修改,修改为:修改全局属性内容所用。 4. 将各元素修改为:调用有参构造函数创建自身包含实例。 5. 创建抽象方法,用于返回全局属性。 6. 各元素皆重写此方法,用于返回全局属性。 至此可实现:通过构造函数对枚举类中各个元素的属性进行赋值,且调用其自定义方法获取值。 */ public enum TestEnum{ private String msg;//此处属性为各元素中所含实例均有,用于保存构造内容 ONE("one"){ public abstract void sayHi(){ return msg; } }, TWO("two"){ public abstract void sayHi(){ return msg; } }; //此处创建有参构造,将无参默认构造消除,且注意其修饰必为私有: private TestEnum(String msg){ this.msg = msg; } //此处创建抽象方法,要在各元素后添加方法实现: public abstract String sayHi(); }