Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,252 views

Published on

Shibuya.apk#20で発表したLTのスライドです。

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

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

×