代码结构调整,枚举 enum

枚举, 今天在优化代码时,觉得很多代码

public static final xxx 的方式,都可以优化一下,并且将来很多同类型的数据进行整合,就想到了枚举,
也特地百度,复习了一下, 很多都是 copy的只为了学习

for example

<1
public enum TypeEnum {

ONE, TWO, THREE  

}

<2 枚举限定值

public enum TypeEnum {

ONE(1), TWO(2), THREE(3)


int value;  

TypeEnum(int value) {  
    this.value = value;  
}  

public int getValue() {  
    return value;  
} 

}

TypeEnum.ONE.getValue()

<3


enum还内置了许多方法,常用的如下:
int compareTo(E o)  比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。

String name()  返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString() 返回枚举常量的名称,它包含在声明中。


static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回带指定名称的指定枚举类型的枚举常量。

static T[] values()
返回该枚举的所有值。

< 4.

public enum TypeEnum {

    ONE(1, "一"), TWO(2, "二"), THREE(3, "三");  

    int value;  
    String name;  

    TypeEnum(int value, String name) {  
        this.value = value;  
        this.name = name;  
    }  

    public int getValue() {  
        return value;  
    }  

    public String getName() {  
        return name;  
    }  

    //举例,通过name 获取 value
    public TypeEnum getByValue(int value) {  
        for(TypeEnum typeEnum : TypeEnum.values()) {  
            if(typeEnum.value == value) {  
                return typeEnum;  
            }  
        }  
        throw new IllegalArgumentException("No element matches " + value);  
    }  
}  

<5 枚举判断,

.equls 和 == 是一样的 枚举的 equls 内部封装的是 ==

<6 使用接口

   public enum TypeEnum  implements InfXXX{

    ONE, TWO, THREE  

  }  

< 7. EnumSet,EnumMap 的应用


public class Test {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
        for (EnumTest day : weekSet) {
            System.out.println(day);
        }

        // EnumMap的使用
        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        // ... ...
        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<EnumTest, String> entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}

<8 .原理分析

enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{
    public static final com.hmw.test.EnumTest MON;
    public static final com.hmw.test.EnumTest TUE;
    public static final com.hmw.test.EnumTest WED;
    public static final com.hmw.test.EnumTest THU;
    public static final com.hmw.test.EnumTest FRI;
    public static final com.hmw.test.EnumTest SAT;
    public static final com.hmw.test.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.hmw.test.EnumTest[] values();
    public static com.hmw.test.EnumTest valueOf(java.lang.String);
    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值