使用情况
密封类和枚举类,都使用于描述某种情况的集合,比如播放器的播放状态 。
枚举类
枚举类和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();
}
}