JavaSE---枚举类
1、Why?为什么要有枚举类?
a, 手动实现枚举类,代码量较大,实现比较麻烦;
b, 使用常量表示 枚举,存在的问题:
类型不安全;对象的意义不明确;
private static final int SPRING = 1;// 春天
private static final int SUMMER = 2;// 夏天
2、What?
2.1、JDK5后 ,Java提供了enum关键字;
2.2、枚举类 与 普通类的区别:
a, 使用enum定义的类 默认继承java.lang.Enum类,不是Object;
b, 枚举类的构造器 只能使用private修饰,如果省略了修饰符,默认使用private;
c, 枚举类的所有实例必须显式指出,实例默认会添加 public static fianl,无需显式指定;
d, 所有枚举类都提供一个values(),很方便的遍历所有的枚举值;
3、How?
3.1、所有 枚举值之间使用 英文逗号 分隔,枚举值结束 用 英文分号 结束;
3.2、switch中使用枚举,只需要 使用枚举值的名字,无需添加枚举类作为限定;
public enum EnumTest {
SPRING,SUMMER;
}
import static com.an.EnumTest.SPRING;
public class Test {
public static void main(String[] args) {
EnumTest o= null ;
switch (o){
case SPRING :
break;
}
}
}
4、Enum类
4.1、Java中所有的枚举类 默认都继承 Enum类;
4.2、Eunm实现了Comparable、Serializable 2个接口;
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
// 枚举值常量的名称,程序员应该使用toString(),避免直接访问name字段
private final String name;
// 枚举值常量的序号
private final int ordinal;
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
public final String name() {
return name;
}
public final int ordinal() {
return ordinal;
}
public String toString() {
return name;
}
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
}
private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
}
5、实现接口的枚举类
6、包含抽象方法的枚举类
7、拓展
package com.an.enumtest;
public enum UserEnum {
MAN,WOMAN;
/**
* public final class com.an.enumtest.UserEnum extends java.lang.Enum<com.an.enumtest.UserEnum>
*
* public static final com.an.enumtest.UserEnum MAN;
*
* public static final com.an.enumtest.UserEnum WOMAN;
*
* public static com.an.enumtest.UserEnum[] values();
*
* public static com.an.enumtest.UserEnum valueOf(java.lang.String);
*/
/**
* 1、枚举类 默认继承 java.lang.Enum,编译后 为 public final class *** extends java.lang.Enum
* 2、枚举类的 元素 作为 内部类存在 public static final com.an.enumtest.UserEnum MAN;
* 3、枚举类的 元素 在JVM中 唯一实例,比较直接用==;
*/
}
浙公网安备 33010602011771号