枚举的嵌套和归类 - 通过接口实现类似继承的效果

背景

枚举因为无法使用继承,所以定义的枚举变量里如果要体现层级关系或者包含关系,需要通过接口来实现。

参考

枚举· 《On Java 8》中文版

代码实现


//枚举类
interface Food {
   enum class EastFood : Food {
       noodle,baozi
   }
   enum class WestFood : Food {
       piza
   }
}
  
//test调用
   fun test() {
       Log.d("enum_test", "enum_test")
       val p: Food = Food.EastFood.noodle

       if(p is Food){
           Log.d("enum_test", "p is class Food")
       }else{
           Log.d("enum_test", "p is not class Food")
       }

   		//kotlin的when 将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。
   		//这里when需要使用同一层级的标准判断,如如果两个分支都符合,满足前一个分支就退出了
       when (p) {
           is Food.EastFood -> { Log.d("enum_test", "p is class Food.EastFood")}
           is Food.WestFood -> {Log.d("enum_test", "p is class Food.WestFood")}
           Food.EastFood.noodle -> {Log.d("enum_test", "p: Food.EastFood.noodle")}
           Food.EastFood.baozi -> {Log.d("enum_test", "p: Food.EastFood.baozi")}
           Food.WestFood.piza -> {Log.d("enum_test", "p: Food.WestFood.piza")}
           else ->{Log.d("enum_test", "nothing")}
       }

       when (p) {
           is Food.EastFood -> { Log.d("enum_test", "p is class Food.EastFood")}
           is Food.WestFood -> {Log.d("enum_test", "p is class Food.WestFood")}
           else ->{Log.d("enum_test", "nothing")}
       }

       when (p) {
           Food.EastFood.noodle -> {Log.d("enum_test", "p: Food.EastFood.noodle")}
           Food.EastFood.baozi -> {Log.d("enum_test", "p: Food.EastFood.baozi")}
           Food.WestFood.piza -> {Log.d("enum_test", "p: Food.WestFood.piza")}
           else ->{Log.d("enum_test", "nothing")}
       }
   }

结果

在这里插入图片描述

总结

枚举如何继承:

Java 中 Enum 如何继承?
Enum的本质语义是把一个类的多个实例直接列举出来。
而继承是类的行为, 不是实例的行为。
因为在语义设计上不能被继承,所以在实现时要进行语法上的约束,编译器会将其声明为final。

枚举原理:

Java枚举的深入理解以及实现原理:
枚举本质上是通过普通的类来实现的,只是编译器为我们进行了处理。
每个枚举类型都继承自java.lang.Enum,并自动添加了values和valueOf方法。
而每个枚举常量是一个静态常量字段,使用内部类实现,该内部类继承了枚举类。
所有枚举常量都通过静态代码块来进行初始化,即在类加载期间就初始化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值