Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
730
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
1k
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.3k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.2k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.5k
Kotlinでサーバサイドを始めよう!
ntaro
1
1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.9k
Kotlin Contracts #m3kt
ntaro
4
4.2k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
530
Other Decks in Programming
See All in Programming
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
230
WebRTC と Rust と8K 60fps
tnoho
2
2k
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
pd1xx
1
720
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
480
認証・認可の基本を学ぼう前編
kouyuume
0
250
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
410
AIコーディングエージェント(Manus)
kondai24
0
190
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
160
認証・認可の基本を学ぼう後編
kouyuume
0
240
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
190
Cap'n Webについて
yusukebe
0
130
Featured
See All Featured
How GitHub (no longer) Works
holman
316
140k
Practical Orchestrator
shlominoach
190
11k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
Thoughts on Productivity
jonyablonski
73
5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
A designer walks into a library…
pauljervisheath
210
24k
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として見える