Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan
Search
Taro Nagasawa
June 29, 2017
Programming
1
680
JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan
第6回 Kotlin勉強会@Sansan(
https://sansan.connpass.com/event/57683/
)で使用したスライドです。
Taro Nagasawa
June 29, 2017
Tweet
Share
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
440
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.2k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.3k
Kotlinでサーバサイドを始めよう!
ntaro
1
940
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.6k
Kotlin Contracts #m3kt
ntaro
4
3.9k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
440
Other Decks in Programming
See All in Programming
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
7
1.5k
情報漏洩させないための設計
kubotak
4
840
Recoilを剥がしている話
kirik
5
7.2k
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
200
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
130
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
300
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
760
Spatial Rendering for Apple Vision Pro
warrenm
0
150
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
150
暇に任せてProxmoxコンソール 作ってみました
karugamo
2
730
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1031
460k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Six Lessons from altMBA
skipperchong
27
3.5k
The Cost Of JavaScript in 2023
addyosmani
46
7k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
Being A Developer After 40
akosma
87
590k
Side Projects
sachag
452
42k
Transcript
JavaからKotlinへの移行 -KotlinからJavaを使う: プラットフォーム型編- 2017-06-29 Kotlin勉強会@Sansan 長澤太郎 @ngsw_taro
6月15日 第1回 CA.kt
JavaからKotlinへの移行 -JavaからKotlinが呼び出される編- • Kotlinにはstaticという概念がない ◦ @JvmStaticや@JvmFieldを上手く使う • FWのためだけに毎回openするのが面倒 ◦ Springならkotlin-springコンパイラプラグインを使う
◦ all-openコンパイラプラグインを使う • デフォルトコンストラクタを提供したくない ◦ no-argコンパイラプラグインを使う
KotlinからJavaを使う: プラットフォーム型編
自己紹介 • 長澤 太郎(たろーって呼んでね) • @ngsw_taro • エムスリー株式会社でエンジニアやってます • Kotlinエバンジェリスト(JetBrains黙認)
• 日本Kotlinユーザグループ代表 • 「Kotlinスタートブック」の著者
Null安全 • nullの可能性のあるものと、そうでないものを厳格に区別する ことでケアレスミスを防ぐ val a: Int = null //
コンパイルエラー val b: Int? = null // OK b.toString() // コンパイルエラー if (b != null) b.toString() // OK b?.toString() // OK
Java(の参照型)は常にnullの可能性がある // Java Optional<String> nullは返さないよ() { return null; }
Javaコードの呼び出し結果はハテナだらけ? val foo: File = File("/") val bar: File? =
foo.absoluteFile val baz: File? = foo.parentFile
Javaコードの呼び出し結果はハテナだらけ? val foo: File = File("/") val bar: File? =
foo.absoluteFile val baz: File? = foo.parentFile コンストラクタの 戻り値はNotNull getXxx()メソッドは xxxプロパティのように
Javaコードの呼び出し結果はハテナだらけ? val foo: File = File("/") val bar: File? =
foo.absoluteFile val baz: File? = foo.parentFile 常にnullを返さないメソッドもあ るのに面倒だな
ハテナだらけだったら まだ「めんどくさい」で 済んだ...!
プラットフォーム型 • nullかもしれないし、nullじゃないかもしれない型 • 受ける型を省略することで、プラットフォーム型を維持 • 例えば「File!」として表記される val baz =
foo.parentFile baz.exists() //=> ぬるぽ
プラットフォーム型 • nullかもしれないし、nullじゃないかもしれない型 • 受ける型を省略することで、プラットフォーム型を維持 • 例えば「File!」として表記される val baz =
foo.parentFile baz.exists() //=> ぬるぽ File!が返される 型を省略しているので File!のまま 危険な操作であるにも関わらず普通に メンバアクセス可能 (上手く行くこともあるが、今回はぬるぽ)
ifでnullチェックして回避 val baz = foo.parentFile if (baz != null) baz.exists()
else false
ifでnullチェックして回避 val baz = foo.parentFile if (baz != null) baz.exists()
else false Javaと 変わらん!! ※プラットフォーム型 + nullチェックはJavaと同じだが、 Nullable + nullチェックはJavaよりも安全。nullチェックを 否定したいわけではないことに注意。
安全呼び出しで回避 val baz = foo.parentFile baz?.exists() まぁ安全
だったらNullableとして明示すりゃあいい val baz: File? = foo.parentFile // あとはご自由に • とにかく安全!
• プラットフォーム型の存在意義とは • 結局ハテナだらけで面倒問題に戻る →注意深くコーディングして、うっかり死ぬよりマシ
NotNullとして明示すると...? val baz: File = foo.parentFile // 上手くいけば、あとはご自由に
NotNullとして明示すると...? val baz: File = foo.parentFile // 上手くいけば、あとはご自由に nullでない参照が返されればOK。 以後、NotNullとして扱える
NotNullとして明示すると...? val baz: File = foo.parentFile // 上手くいけば、あとはご自由に nullでない参照が返されればOK。 以後、NotNullとして扱える
nullが返されるとクラッシュ! IllegalArgumentException
結論: プラットフォーム型は厄介 • プラットフォーム型のまま扱うということはJavaの世界と同じ で、いつNPEが起きてもおかしくない状況 • Javaコードがnullを返す可能性があるのかどうか自信が持 てない場合は、Nullableを明示するのが無難! • Javaコードがnullを返さないことに自信がある場合には、
NotNullを明示する。なぜなら、それがnullだった場合に早 期に発見できるから。
Java側でNullable/NotNullを表明する • JSR-305: @Nullable, @Nonnull • JetBrains: @Nullable, @NotNull •
Android Support: @Nullable, @NonNull // Java class Hoge { @Nonnull static Hoge newInstance() {...} } // Kotlin val hoge = Hoge.newInstance() hoge.doSomething() NotNullとして見える