0
0

More than 1 year has passed since last update.

[Kotlin]ずっと分からなかったsealedクラスを掘り下げる

Last updated at Posted at 2022-01-20

誤り

sealedクラスのメリットである、When式の網羅に関して、具体例のコードがwhen文になっていました。
つまり、戻り値がないので網羅されてない時にコンパイルエラーは起きないという事でした。

また、when文であってもKotlin1.7以降はコンパイルエラーになるようです。

sdkeiさんありがとうございました。

はじめに

Kotlinにsealedクラスという機能があります、度々見たり、周りのAndroiderが公用語のごとく使っていて、自分は分かったふりをしていました・・・

ここで掘り下げておきます。

sealedクラスを端的に

一言で表すと、「制限」。
何を制限するかと言いますと、下記の様にマークされたクラスは継承を制限することを明示します。

制限されていても、継承できる場合は下記です。

コンパイル時に、同ファイル以外にサブクラスがないことが共有されます。

  • sealedクラスのネスト内
  • 同じファイル内
Sonic.kt
sealed class Sonic {
     class Shadow: Sonic()
     class Tails: Sonic()
     class Knuckles: Sonic()
}

class EggMan: Sonic()
Other.kt
class Other : Sonic() // error

メリット

enumとかなり似てるなと思いました。
違いに関しては、 enumは、コンパイル後にインスタンス生成ができないが、sealedはコンパイル後にサブクラスを作成できない。

when文の時に分岐の漏れがなくなる

例えば、sealedクラス内に新しくクラスを追加した後、when文の方にも変更を加える必要がある場合。
仮に忘れてしまっても、コンパイルで弾いてくれます。

// Sonic.EggManが欠けているのでコンパイルエラー
val result = when(sonicCharacter) {
    is Sonic.Shadow -> { print("It's Shadow.") }
    is Sonic.Tails -> { print("It's Tails.") }
    is Sonic.Knuckles -> { print("It's Knuckles.") }
}

3.サブクラスを簡単に把握することが出来る(エラー確認の時間も短縮)

おわりに

意外と単純なことだなと思いました。

しかし、こちらの方がかなり深く考察をされていたので、氷山の一角しか見れてないのだなと思いました・・

参考

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0