SlideShare a Scribd company logo
1 of 22
Download to read offline
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, サーバー)を扱える
エンジニアを募集中です

More Related Content

What's hot

Integrating Service Mesh with Kubernetes-based connected vehicle platform
Integrating Service Mesh with Kubernetes-based connected vehicle platformIntegrating Service Mesh with Kubernetes-based connected vehicle platform
Integrating Service Mesh with Kubernetes-based connected vehicle platform
Jun Kai Yong
 

What's hot (20)

KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
 
Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方
 
Integrating Service Mesh with Kubernetes-based connected vehicle platform
Integrating Service Mesh with Kubernetes-based connected vehicle platformIntegrating Service Mesh with Kubernetes-based connected vehicle platform
Integrating Service Mesh with Kubernetes-based connected vehicle platform
 
BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~
BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~
BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
 
Kubernetes Networking
Kubernetes NetworkingKubernetes Networking
Kubernetes Networking
 
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
 
Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらい
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 

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