Sealedインターフェースは、Kotlinにおける特別なタイプのインターフェースであり、同一モジュール内での実装の数を制限することができます。最初にsealedクラスがKotlinに登場しましたが、sealedインターフェースはKotlin 1.5以降に追加され、状態の階層やイベント処理に関与するタイプをよりコントロールするための進化として導入されました。
以前は、開発者はsealedクラスを使用して継承を制限し、安全な階層を作成していました。しかし、複数のタイプから継承することが有用な構造をサポートするために、sealedインターフェースが必要とされました。
sealedインターフェースがない場合、インターフェースのサブクラスの集合を柔軟に管理することができません。これにより、例えば、ステートを処理する際にwhenによる包括的なチェックが不可能になります。なぜなら、すべてがインターフェースに基づいているためであり、抽象クラスや具体クラスだけではないためです。
sealedインターフェースの使用により、以下のことが可能になります:
コードの例:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Click event") is Scroll -> println("Scroll event") }
主な特徴:
sealedインターフェースは宣言ファイルの外で実装を持つことができるか?
いいえ、sealedインターフェースの実装は同じモジュール内に存在する必要があります。これにより完全な包括性が確保され、コンパイラがその数を制御できるようになります。
sealedインターフェースはクラスやオブジェクトとどのように相互作用するか?
Sealedインターフェースは、通常のクラスとobjectクラスの両方、さらにはdata object(Kotlin 1.9+)によって実装することができます。このようなインターフェースは、sealedクラスではできない複数の継承に存在することができます。
sealed interface Operation object Add: Operation object Subtract: Operation
sealedインターフェースはネスト可能か?
はい、sealedインターフェースを他のsealedクラスの内部または他のインターフェースの上に宣言することができます。重要なのは、すべての実装が同じモジュール内にあることです。
UI状態をsealed修飾子なしで単純にインターフェースとして記述したアプリ。1つの実装を忘れたため、スタティック解析ではこの点を見逃した。エラーは本番環境でのみ発生した。
利点:
欠点:
画面のイベントモデルのためにsealedインターフェースを使用した。すべての実装が同じファイルモジュール内にあり、コンパイラがwhenで閉じられていないブランチを通知します。
利点:
欠点: