誤り
sealed
クラスのメリットである、When式の網羅に関して、具体例のコードがwhen文になっていました。
つまり、戻り値がないので網羅されてない時にコンパイルエラーは起きないという事でした。
また、when文であってもKotlin1.7以降はコンパイルエラーになるようです。
sdkeiさんありがとうございました。
はじめに
Kotlinにsealed
クラスという機能があります、度々見たり、周りのAndroiderが公用語のごとく使っていて、自分は分かったふりをしていました・・・
ここで掘り下げておきます。
sealed
クラスを端的に
一言で表すと、「制限」。
何を制限するかと言いますと、下記の様にマークされたクラスは継承を制限することを明示します。
制限されていても、継承できる場合は下記です。
コンパイル時に、同ファイル以外にサブクラスがないことが共有されます。
-
sealed
クラスのネスト内 - 同じファイル内
sealed class Sonic {
class Shadow: Sonic()
class Tails: Sonic()
class Knuckles: Sonic()
}
class EggMan: Sonic()
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.サブクラスを簡単に把握することが出来る(エラー確認の時間も短縮)
おわりに
意外と単純なことだなと思いました。
しかし、こちらの方がかなり深く考察をされていたので、氷山の一角しか見れてないのだなと思いました・・