基本特性
枚举类型可以被看成特殊的类,它继承了Enum类,所以不能再继承其他的类。enum类也不能被其他类继承。
定义与基本方法
enum Food{
COFFEE,CAKE,FRUIT
}
public class TestBasic {
public static void main(String[] args) {
for(Food food:Food.values()){
System.out.println(food);
}
}
}
/*
COFFEE
CAKE
FRUIT
*/
values方法返回enum类中定义的所有成员的数组
values方法并不是在Enum类中定义的,而是在生成enum类时,由编译器自动添加的。
还有valueOf方法,返回具有指定名称的此类型的enum常量。该字符串必须与此类型中用于声明enum常量的标识符完全匹配。(不允许使用多余的空白字符。)
在enum中定义方法
可以向enum中添加方法,甚至可以有main方法
enum Food{
COFFEE("kafei")
,CAKE("dangao"),
FRUIT("shuiguo");
private String description;
private Food(String s){
this.description = s;
}
public String getDescription() {
return description;
}
}
public class TestBasic {
public static void main(String[] args) {
for(Food food:Food.values()){
System.out.println(food);
System.out.println(food.getDescription());
}
}
}
/*
COFFEE
kafei
CAKE
dangao
FRUIT
shuiguo
*/
添加方法时,必须先声明enum实例,在实例后必须加上分号。
也可以为每个常量添加自己的行为
enum Food{
COFFEE("kafei"){
@Override
void eat(){
System.out.println("drink");
}
}
,CAKE("dangao"){
@Override
void eat() {
System.out.println("eat");
}
},
FRUIT("shuiguo"){
@Override
void eat() {
System.out.println("peel");
}
};
private String description;
private Food(String s){
this.description = s;
}
public String getDescription() {
return description;
}
abstract void eat();
}
public class TestBasic {
public static void main(String[] args) {
for(Food food:Food.values()){
System.out.println(food);
System.out.println(food.getDescription());
food.eat();
}
}
}
/*
COFFEE
kafei
drink
CAKE
dangao
eat
FRUIT
shuiguo
peel*/
要实现种方式,必须在enum类中添加abstract方法。
用接口组织枚举
enum Meal{
APPETIZER(Food.APPETIZER.class),DESSERT(Food.DESSERT.class);
private Food[] values;
private Meal(Class<? extends Food> kind){
values = kind.getEnumConstants();
}
public interface Food{
enum APPETIZER implements Food{
SALAD,SOUP;
}
enum DESSERT implements Food{
CAKE,FRUIT
}
}
private <T> T random(T[] values){
Random rand = new Random(47);
return values[rand.nextInt(values.length)];
}
public Food randomSelection(){
return this.random(this.values);
}
}
public class TestInterface {
public static void main(String[] args) {
for(int i =0;i<5;i++){
for(Meal meal : Meal.values()){
Meal.Food food = meal.randomSelection();
System.out.println(food);
}
System.out.println("-----");
}
}
}
在switch中使用枚举
case语句后出整型和字符型之外,还可以使用枚举类型,这样可以减少大量if-else语句的使用。
可以参考codesheep的文章