枚举类型

基本特性

枚举类型可以被看成特殊的类,它继承了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的文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值