java基础

Java枚举

2018-09-27  本文已影响15人  今有所思

枚举

普通方式定义(int枚举模式)

/**
 * 使用普通方式定义日期常量
 */
public class Weekday {

    public static final int MONDAY = 1;

    public static final int TUESDAY = 2;

    public static final int WEDNESDAY = 3;

    public static final int THURSDAY = 4;

    public static final int FRIDAY = 5;

    public static final int SATURDAY = 6;

    public static final int SUNDAY = 7;

}

枚举方式

public enum WeekdayEnum {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Enum抽象类常见方法

Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:

返回类型 方法名称 方法说明
int compareTo(E o) 比较此枚举与指定对象的顺序
boolean equals(Object other) 当指定对象等于此枚举常量时,返回 true。
Class<?> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
String toString() 返回枚举常量的名称,它包含在声明中
static<T extends Enum<T>> T static valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。

枚举的七种用法

  1. 常量
  2. switch
  3. 向枚举中添加新方法
    如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号,而且 Java 要求必须先定义 enum 实例。
public enum WeekdayEnum {
    MONDAY(1, "星期一"), TUESDAY(2, "星期二"), WEDNESDAY(3, "星期三"),
    THURSDAY(4, "星期四"), FRIDAY(5, "星期五"), SATURDAY(6, "星期六"), SUNDAY(7, "星期日");

    private int index;
    private String name;
    private WeekdayEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public static String getName(int index) {
        for(WeekdayEnum week : values()) {
            if(week.getIndex() == index) {
                return week.getName();
            }
        }
        return null;
    }
    
    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  1. 覆盖枚举的方法
public enum WeekdayEnum {
    MONDAY(1, "星期一"), TUESDAY(2, "星期二"), WEDNESDAY(3, "星期三"),
    THURSDAY(4, "星期四"), FRIDAY(5, "星期五"), SATURDAY(6, "星期六"), SUNDAY(7, "星期日");

    private int index;
    private String name;
    private WeekdayEnum(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public static String getName(int index) {
        for(WeekdayEnum week : values()) {
            if(week.getIndex() == index) {
                return week.getName();
            }
        }
        return null;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return this.index + " " + this.name;
    }
}

  1. 枚举集合的使用
    java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。

equals和==的区别

enum GameEnum{
    BIG,
    SMALL,
    FATTER;
}

public class MainEnum {
    /**
     * 测试枚举比较,使用equal和==
     */
    public static void main(String[] args) {
        GameEnum s1 = GameEnum.BIG;
        GameEnum s2 = GameEnum.BIG;
        GameEnum ss1 = GameEnum.SMALL;
        System.out.println("s1 == s2:" + (s1 == s2));
        System.out.println("s1.equals(s2):" + (s1.equals(s2)));

        System.out.println("s1 == ss1:" + (s1 == ss1));
        System.out.println("s1.equals(ss1):" + (s1.equals(ss1)));
    }
}

源码

public final boolean equals(Object other) {
    return this==other;
}

在枚举中final clone方法确保枚举常量从不会被克隆,而且序列化机制会确保从不会因为反序列化而创造复制的实例。枚举类型的反射实例化也是被禁止的。总之,以上内容确保了除了定义的枚举常量之外,没有枚举类型实例。

上一篇 下一篇

猜你喜欢

热点阅读