Sealed接口是Kotlin中的一种特殊接口类型,允许限制其实现的集合在同一个模块内。封闭类最早出现在Kotlin中,而sealed接口从Kotlin 1.5开始作为对状态层次结构或事件处理等类型的更大控制的演变被添加。
早期开发者使用封闭类来限制继承和创建安全的层次结构。但出于灵活性和支持多重继承的结构,封闭接口变得必要。
没有sealed接口,无法灵活管理接口的子类集合。这使得在处理状态时进行全面的when检查变得不可能,尤其是当一切都基于接口而非抽象类或具体类时。
使用sealed接口可以:
代码示例:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("点击事件") is Scroll -> println("滚动事件") }
关键特点:
sealed接口是否可以在它们声明的文件之外有实现?
不,sealed接口的实现必须位于同一模块中。这确保了完整性并允许编译器控制它们的数量。
sealed接口如何与类和对象互动?
封闭接口可以被普通类、object类以及data object(Kotlin 1.9+)实现。这样的接口可以出现在多重继承中,而这在sealed类中是无法做到的。
sealed interface Operation object Add: Operation object Subtract: Operation
sealed接口可以嵌套吗?
是的,可以在另一个sealed类内部或在其他接口上方声明sealed接口。关键是所有实现都应位于同一模块中。
在应用程序中,UI状态简单地通过没有sealed修饰符的接口来描述。遗漏了一种实现,静态分析未发现此问题;错误仅在生产环境中被发现。
优点:
缺点:
在屏幕事件模型中使用sealed接口。所有实现都在同一模块的一个文件中,编译器在when中遗漏的分支上会发出警告。
优点:
缺点: