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) | 返回带指定名称的指定枚举类型的枚举常量。 |
枚举的七种用法
- 常量
- switch
- 向枚举中添加新方法
如果打算自定义自己的方法,那么必须在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;
}
}
- 覆盖枚举的方法
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;
}
}
- 枚举集合的使用
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方法确保枚举常量从不会被克隆,而且序列化机制会确保从不会因为反序列化而创造复制的实例。枚举类型的反射实例化也是被禁止的。总之,以上内容确保了除了定义的枚举常量之外,没有枚举类型实例。