Enum可以将一组具名的有限集合创建成一种新的类型,而这些具名的值可以作为常规的程序组件使用。
在创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum,所以enum本身也是一个类。
package myenums;
public enum Color {
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
PURPLE
}
package myenums;
public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
enum中所有的枚举值,都是这个类静态常量。
可以使用==来比较enum实例,编译器会自动为你提供equals和hashCode方法。
package me.benzeph.myenums;
import org.junit.Test;
import static myenums.Color.BLUE;
import static myenums.Color.RED;
import static myenums.Day.MONDAY;
import static myenums.Day.THURSDAY;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
public class MyEnumTest {
@Test
public void shouldReturnTrue() {
assertFalse(MONDAY == THURSDAY);
assertFalse(BLUE == RED);
assertThat(BLUE, is(BLUE));
}
}
除了不能继承一个enum,基本可以将enum看做一个常规的类。
如果打算在enum中定义自己的方法,必须在enum实例序列的最后添加一个分号,同时必须先定义一个enum实例(在方法之前)。
package myenums;
public enum Color {
RED("red"),
ORANGE("orange"),
YELLOW("yellow"),
GREEN("green"),
BLUE("blue"),
PURPLE("purple");
String value;
private Color(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
在switch中使用enum,是enum提供的一个非常方便的功能。
package me.benzeph.myenums;
import myenums.Color;
import org.junit.Test;
import static myenums.Color.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class MyEnumTest {
@Test
public void shouldReturnBlue() {
assertThat(choose(BLUE), is("blue"));
}
private String choose(Color color) {
String value;
switch (color) {
case RED:
value = RED.getValue();
break;
case GREEN:
value = GREEN.getValue();
break;
case BLUE:
value = BLUE.getValue();
break;
default:
value = "colorful";
}
return value;
}
}
values()方法,可以得到enum中所有元素的数组。
package me.benzeph.myenums;
import myenums.Color;
import org.junit.Test;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class MyEnumTest {
@Test
public void shouldReturn6() {
assertThat(Color.values().length, is(6));
}
}
如果你研究一下父类Enum,你会发现它并没有values()方法。
values()方法是由编译器添加的static方法。