Kotlin细节十四:密封类和枚举类

使用情况

密封类和枚举类,都使用于描述某种情况的集合,比如播放器的播放状态 。

枚举类

枚举类和java 并没有区别 。
每一个枚举都是枚举类的实例。
所以不需要我们自己创建,但是也限制了我们为枚举设置动态属性。这也是和密封类的区别。

enum class Funcs:Runnable{
    Car{
        override fun run() {
            print("drive")
        }

    },
    Plane{
        override fun run() {
            print("fly")
        }

    }
}

fun main(){
    Funcs.Car.run()
}

密封类是如何实现有限状态的

密封类约束的是子类的类型 。

  • 密封类是抽象类,而且它的构造方法私有化。
  • 密封类的子类必须声明在 密封类的文件中声明 。

使用方式也很简单,实现原理也就是编译器的约束。 虽说它的 无参构造方法是 private 的,但是还是在编译时提供了一个 puclic 构造函数 。

sealed class PlayState{
    abstract var time:String
}

 class Playing(override var time: String) : PlayState() {
     
 }

class Stop(override var time: String) : PlayState() {

}

反编译

public final class Playing extends PlayState {
   @NotNull
   private String time;

   @NotNull
   public String getTime() {
      return this.time;
   }

   public void setTime(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.time = var1;
   }

   public Playing(@NotNull String time) {
      Intrinsics.checkParameterIsNotNull(time, "time");
      super((DefaultConstructorMarker)null);
      this.time = time;
   }
}
// PlayState.java
package com.example.diva.github.common;

import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;


public abstract class PlayState {
   @NotNull
   public abstract String getTime();

   public abstract void setTime(@NotNull String var1);

   private PlayState() {
   }

   // $FF: synthetic method
   public PlayState(DefaultConstructorMarker $constructor_marker) {
      this();
   }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值