Enum

本章内容主要参考《Java编程思想》-第四版

Enum


目录

Enum

1.基本特性

2.在enum中添加方法以及重写

3.vlues()从何而来


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

从结果归纳:

enum内置方法
序号方法结果
1
name()
返回enum的声明名字
2
ordinal()
声明的次序
3
item.compareTo(EnumClassA.BLUE)
比较次序的位置,item在前面-1,同一个0,后面为1
4
item.equals(EnumClassA.BLUE)
通过hashcode方法判断值是否相等
5
getDeclaringClass()
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实例。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值