本章内容主要参考《Java编程思想》-第四版
Enum
目录
1.基本特性
使用enum类的values()方法,可以遍历enum实例,返回一个数组,并且严格保持在enum中声明的顺序,我们首先通过一个循环将enum中的方法结果查看:
创建enum类
public enum EnumClassA {
RED,BLUE,GREEN
}
创建测试类:
public static void main(String[] args) {
for (EnumClassA item:EnumClassA.values()){
System.out.println("-----------------------------------");
System.out.println("item:item.ordinal>>"+item+":"+item.ordinal());
System.out.println("item:item.name>>"+item+":"+item.name());
System.out.println("item:compareTo(EnumClassA.BLUE)>>"+item+":"+item.compareTo(EnumClassA.BLUE));
System.out.println("item:item.equals(EnumClassA.BLUE)>>"+item+":"+item.equals(EnumClassA.BLUE));
System.out.println("item:item==EnumClassA.BLUE>>"+item+":"+(item==EnumClassA.BLUE));
System.out.println("item:item.getDeclaringClass()>>"+item+":"+item.getDeclaringClass());
System.out.println("-----------------------------------");
}
}
运行查看结果:
-----------------------------------
item:item.ordinal>>RED:0
item:item.name>>RED:RED
item:compareTo(EnumClassA.BLUE)>>RED:-1
item:item.equals(EnumClassA.BLUE)>>RED:false
item:item==EnumClassA.BLUE>>RED:false
item:item.getDeclaringClass()>>RED:class com.dcpnet.Enumeration.EnumClassA
-----------------------------------
-----------------------------------
item:item.ordinal>>BLUE:1
item:item.name>>BLUE:BLUE
item:compareTo(EnumClassA.BLUE)>>BLUE:0
item:item.equals(EnumClassA.BLUE)>>BLUE:true
item:item==EnumClassA.BLUE>>BLUE:true
item:item.getDeclaringClass()>>BLUE:class com.dcpnet.Enumeration.EnumClassA
-----------------------------------
-----------------------------------
item:item.ordinal>>GREEN:2
item:item.name>>GREEN:GREEN
item:compareTo(EnumClassA.BLUE)>>GREEN:1
item:item.equals(EnumClassA.BLUE)>>GREEN:false
item:item==EnumClassA.BLUE>>GREEN:false
item:item.getDeclaringClass()>>GREEN:class com.dcpnet.Enumeration.EnumClassA
-----------------------------------
Process finished with exit code 0
从结果归纳:
序号 | 方法 | 结果 |
1 | | 返回enum的声明名字 |
2 | | 声明的次序 |
3 | | 比较次序的位置,item在前面-1,同一个0,后面为1 |
4 | | 通过hashcode方法判断值是否相等 |
5 | | enum所属类 |
分析equls与==可以判断出enum中的元素是以值得形式存在,而不是对象。
2.在enum中添加方法以及重写
一般来说,可以将enum看成一个常规的类,可以往其中添加方法,甚至是psvm
Enum
public enum EnumWithMethod {
RED("Color","红色"),
BLUE("Color","蓝色"),
GREEN("Color","绿色");/*这里必须添加一个分号*/
private String desc;
private String desc1;
EnumWithMethod(String desc,String desc1){
this.desc = desc;
this.desc1 = desc1;
}
@Override
public String toString() {
return desc+":"+desc1;
}
}
执行类
public static void main(String[] args) {
for (EnumWithMethod item:EnumWithMethod.values()){
System.out.println(item.ordinal()+"."+item.name()+":"+item.toString());
}
}
结果
0.RED:Color:红色
1.BLUE:Color:蓝色
2.GREEN:Color:绿色
Process finished with exit code 0
3.vlues()从何而来
如果你不是作为新手来阅读这篇文章的时候,你应该会ctrl点住Enum进去看Enum的源码,查看Enum是怎么实现的,然后你会发现,在本来的类里面,并没有values()这个方法,那是为什么呢?
Enum源码简略
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
public final String name(){...};
public final int ordinal(){...};
protected Enum(String name, int ordinal){...};
public String toString(){...};
public final boolean equals(Object other){...};
public final int hashCode(){...};
protected final Object clone() throws CloneNotSupportedException{...};
public final int compareTo(E o){...};
public final Class<E> getDeclaringClass(){...};
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name){...};
protected final void finalize(){...};
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{...};
private void readObjectNoData() throws ObjectStreamException{...};
}
显然,其中并没有values()这个方法,从书上查阅得知,values()这个方法是由编译器添加的static方法。如果你将实例向上转型为Enum的时候,这个方法就不能使用了,不过可以使用item.getClass().getEnumConstants()获取到所有的enum实例。