Kotlinのsealedクラスとは?when式と組み合わせて使う方法を初心者向けに解説!
生徒
「Kotlinで『sealedクラス』って出てきたんですが、どういう意味ですか?」
先生
「sealed(シールド)クラスは、あるグループのクラスを限定して、when式で安全に使えるようにする特別なクラスです。」
生徒
「限定するってどういうことですか? 普通のクラスと何が違うんですか?」
先生
「sealedクラスを使うと、そのクラスを継承できるクラスを決められるんです。だから、安全に分岐処理ができるんですよ。初心者向けにわかりやすく説明していきましょう!」
1. sealedクラスとは?Kotlinでの意味と特徴
Kotlinのsealedクラスは、特定のクラスをまとめてグループ化し、その中だけで使うように制限する仕組みです。sealedは「封印された、閉じられた」という意味で、継承できるクラスを限定できるのが特徴です。
これにより、when式でその種類をすべてチェックでき、予期しないクラスの混入を防ぐことができます。
2. sealedクラスの基本的な書き方
まずは、Kotlinでのsealedクラスの定義方法を見てみましょう。以下は、交通信号を表すsealedクラスの例です。
sealed class TrafficSignal
class Red : TrafficSignal()
class Yellow : TrafficSignal()
class Green : TrafficSignal()
sealed class TrafficSignalでベースとなる親クラスを作り、そのあとにRedやYellowなどのサブクラスを定義します。
3. sealedクラスとwhen式の組み合わせ
sealedクラスの最大の利点は、when式と組み合わせたときに、すべてのパターンを網羅的にチェックできることです。以下のように使います。
fun showSignalMeaning(signal: TrafficSignal) {
when (signal) {
is Red -> println("止まれ")
is Yellow -> println("注意して進め")
is Green -> println("進んでOK")
}
}
このようにすれば、elseを書かなくても、すべての種類を漏れなく処理できます。
4. 実行例:sealedクラスを使ってみよう
fun main() {
val signal: TrafficSignal = Green()
showSignalMeaning(signal)
}
進んでOK
このように、sealedクラスとwhen式を使えば、クラスの種類ごとに安全に処理を分けることができます。
5. sealedクラスの活用シーンは?
Kotlinのsealedクラスは、次のような場面でよく使われます。
- 状態管理(例:アプリの画面ステータスやAPIの結果)
- 限定された入力パターン(例:操作イベントや通知の種類)
- 複数の型をまとめて扱いたいとき
例えば、ログイン画面の状態が「未入力」「ログイン中」「エラー」「完了」など決まっている場合、それぞれをsealedクラスで定義すれば、間違った状態を排除でき、バグを防ぎやすくなります。
6. sealedクラスとopenクラスの違いは?初心者向けに解説
Kotlinでは、通常のクラスはopenにしないと継承できません。しかし、sealedクラスは継承前提のクラスです。
ただし、sealedクラスを継承できるのは同じファイル内だけです。これが最大の制約であり、安全性の理由でもあります。
以下に違いをまとめます:
- openクラス:他のファイルでも継承可能。どこからでも継承される可能性がある。
- sealedクラス:同じファイル内だけ継承OK。予測可能な型だけを扱える。
7. Kotlin初心者が覚えておきたいsealedクラスのポイント
sealedクラスを学ぶうえで、以下の点を覚えておくと役立ちます:
- sealedクラスは「限定された継承」をするクラス
- when式で使うと
elseが不要になり、読みやすく安全 - アプリの状態や固定のイベントを表すときに便利
sealedクラスは、一見すると難しそうに見えますが、実際には「決まった選択肢しかないものを、正しく使いたいとき」にぴったりの機能です。
まとめ
Kotlinのsealedクラスは、「決められた種類だけが存在する」ことを保証できる、とても便利な仕組みです。特に、when式と組み合わせることで、安全かつ明確に処理を分けられるのが大きな特徴です。これは、複数の状態や種類を扱う場面で、ミスを減らしやすく、読みやすく、保守しやすいコードを書けることにつながります。
たとえば、交通信号のように「赤・黄・青」の3つだけが存在する状況で、それ以外のものが入り込まないようにするには、sealedクラスが最適です。sealedクラスを使えば、定義したクラス以外は継承できないため、想定外の種類が出てくる心配がありません。
また、when式との相性がとてもよく、elseを省略してもエラーにならず、すべての種類を網羅できるようになっている点も魅力です。これにより、「抜け漏れ」をコンパイル時にチェックできるため、実行時のバグを防ぐことにもつながります。
sealedクラスは、アプリケーションの状態管理や、イベントの種類分け、APIのレスポンスを分けるときなど、多くの場面で活躍します。さらに、sealedクラスを使ったコードは、「今どんな状態か」「何が起きているか」を表すのに非常に向いていて、可読性も高くなります。
以下は、簡単なチャットアプリの状態をsealedクラスで表したサンプルコードです。複雑な条件でも、このように状態を明確に分けることができます。
sealed class ChatState
class Connecting : ChatState()
class Connected(val userName: String) : ChatState()
class Disconnected(val reason: String) : ChatState()
fun showChatStatus(state: ChatState) {
when (state) {
is Connecting -> println("接続中です…")
is Connected -> println("${state.userName} さんが接続しました。")
is Disconnected -> println("切断されました:${state.reason}")
}
}
fun main() {
val currentState: ChatState = Connected("さくら")
showChatStatus(currentState)
}
さくら さんが接続しました。
このように、sealedクラスはただの型の定義にとどまらず、アプリのロジックを明確に整理する道具としてとても役立ちます。特に初心者の方は、最初に「クラスの種類を限定する」考え方を理解しておくことで、Kotlinらしい設計や記述に自然と慣れていくことができます。
今回の記事で、sealedクラスの定義方法、when式との組み合わせ、活用場面などをひと通り学ぶことができました。最初は少し概念が難しく感じるかもしれませんが、身近な例で考えてみると理解しやすくなります。実際にコードを書きながら、sealedクラスを使った状態分岐のメリットを体感してみてください。
生徒
「sealedクラスって、クラスの種類を決めてしまえるんですね。最初はなんとなく難しそうでしたけど、例を見ると使いやすそうです!」
先生
「そうなんです。決まった状態やパターンだけを扱いたいときに、とても相性がいいんですよ。when式との組み合わせも覚えておくと便利です。」
生徒
「たしかに、elseがいらないって安心ですね。どの種類があるかコードを見ればすぐ分かるのも良いです。」
先生
「その通りです。将来もっと複雑なアプリを作るときにも、状態を整理しやすくなりますよ。今のうちにsealedクラスの考え方をしっかり身につけておきましょう。」