Kotlin界のsealed classは
Java界でも『sealed』なのか
● Yoshihisa Takeda
● @bomneko_attack
○ 昨日作ったまっさらで闇を抱えていないアカウント
● 株式会社Diverse(ミクシィグループ)
● YYCというマッチングアプリの開発をしています
● 2017年4月SNS(mixi.jp)インフラからAndroidエンジニアに転生しました
○ AWS移行やってました
おさらい: sealed class
● 修飾子 sealedが付いたclass
● sealedが付いたclassのサブクラスは同じファイルにしか置けない
● 継承そのものを禁止するわけではなく範囲を制限する
○ C#のsealed class とは異なる
● 用途
○ 外部から振る舞いを変えてほしくない
○ 代数的データ型を定義したい時
最初からKotlinで書き始めたならともかく…
● 世の中のアプリはKotlinを途中から入れ始めたものが多いのでは
○ JavaとKotlinの世界を行ったり来たり
● Kotlinで書かれたコードはJava界からどんな風に見えるのか
○ 完全に理解する必要はないがときどき思い出してあげると幸せになるかも
● sealed classはJavaから見ても『sealed』なのか?
Kotlinで書いて逆コンパイルすればええんやな₍₍(ง˘ω˘)ว⁾⁾
● 色のセットを定義した sealed classとそれを利用するJavaで書かれたMain
○ Generatorがランダムに色のインスタンスを返してくるので適当に printlnするやーつ
○ (instanceOfとキャストしまくりなので既にツラミ ...)
₍₍(ง˘ω˘)ว⁾⁾
● sealed class自体はabstract class
● 子クラスは宣言の仕方で違いがある
○ ネストされた子クラス : static final class
○ ネストされていない子クラス : final class
Java界では安全ではない説
やってみましょう₍₍(ง˘ω˘)ว⁾⁾
IntelliJの指示通りに直したら赤線消えたぞ!!
実行!!!
死
● 安全機構はちゃんと入っている
○ デフォルトコンストラクタは Private
○ Publicなコンストラクタはコンパイラが自動生成する合成メソッド
○ DefaultConstructorMarkerってやつが必要らしい
https://github.com/JetBrains/kotlin/blob/master/core/runtime.jvm/src/kotlin/jvm/internal/De
faultConstructorMarker.java
■ Kotlinランタイムが差し込むやつなんでしょうか。詳しい方教えてください
Jarの差し替えができるなら逆コンパイルして
アクセス修飾子書き換えてやればいいのさ !
KotlinのSealed Classは
Sealedされてないじゃないか!
https://stackoverflow.com/questions/19492214/extending-class-with-only-private-constructors/19493363#19493363
せやな
まとめ
● sealed classは継承の範囲を絞る
● 使い所の例
○ 外部から振る舞いを変えてほしくない時
○ 代数的データ型を定義したい時
● sealed classはJavaの世界から見てもsealed
○ Kotlin強い
● でも使うのはKotlin同士のほうが圧倒的に楽
○ when式とSmartCast強い
最後に…
● DiverseではSwift(iOS)/Kotlin(Android, サーバー)を扱える
エンジニアを募集中です

Kotlin界のsealed classはJava界でも『sealed』なのか