シールクラス

Kotlinの**シールクラス(sealed class)**は、クラスの継承階層を制限するための機能であり、特定のクラス階層の安全性と網羅性をコンパイラが保証できるように設計されています。主に、**代数的データ型(Algebraic Data Types)**を表現する目的で使われます。


1. シールクラスの基本概念

  • sealed 修飾子を使うことで、そのクラスの直接のサブクラスをすべて同じファイル内に定義することを強制します。

  • これにより、when式で全てのサブクラスを列挙した場合に、コンパイラが網羅性チェックを行うことが可能になります。

  • 抽象クラスに似ていますが、継承先の制限が明確にある点が異なります。


2. シールクラスの構文

kotlin
sealed class Result data class Success(val data: String) : Result() data class Error(val exception: Throwable) : Result() object Loading : Result()

上記の例では、Result がシールクラスであり、SuccessErrorLoading がすべて同じファイル内で定義されたそのサブクラスです。


3. when式との併用

シールクラスの強力な特徴の1つは、when式との組み合わせにあります。以下のように使うと、else句を必要とせず、安全にすべてのケースを扱うことができます

kotlin
fun handle(result: Result): String { return when (result) { is Success -> "Success: ${result.data}" is Error -> "Error: ${result.exception.message}" Loading -> "Loading..." } }
  • このように、全てのサブクラスを列挙すれば、Kotlinコンパイラは網羅性があると判断し、else句を省略してもエラーになりません。

  • 将来的に新しいサブクラスを追加した場合は、when式にそのケースを追加しなければコンパイルエラーになります。これにより、ロジックの見落としを防げます。


4. シールクラスの用途と利点

項目 内容
用途 状態遷移、結果の表現(Success/Failure)、イベント分岐など
利点 網羅的な分岐の保証、型安全なパターンマッチ、明確な継承制御

5. 注意点

  • シールクラスのサブクラスは同じファイル内に定義しなければなりません(別クラスや別パッケージで定義できない)。

  • シールクラス自体は通常は抽象的な性質を持ち、インスタンス化することは想定されていません。


まとめ

Kotlinのシールクラスは、安全で明示的な継承階層を構築するための便利な機能であり、パターンマッチングのような処理と相性が良いです。特に状態管理やイベント処理において、**「列挙型では表現しきれない複雑な構造を、型安全にモデル化できる」**という点で非常に有用です。

生成日:2025/05/04