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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Taro Nagasawa
June 29, 2017
Programming
760
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan
第6回 Kotlin勉強会@Sansan(
https://sansan.connpass.com/event/57683/
)で使用したスライドです。
Taro Nagasawa
June 29, 2017
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
1.8k
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.4k
#Ubie 狂気の認知施策と選考設計
ntaro
14
14k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.2k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.7k
Kotlinでサーバサイドを始めよう!
ntaro
1
1.1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
3k
Kotlin Contracts #m3kt
ntaro
4
4.4k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
570
Other Decks in Programming
See All in Programming
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
390
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
350
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
Built Our Own Background Agent at LayerX
layerx
PRO
9
5k
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
330
仕様駆動開発の消費期限
watany
16
7.2k
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
430
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
その節約、円になってますか?
isamumumu
1
700
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
460
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
The browser strikes back
jonoalderson
0
1.5k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Abbi's Birthday
coloredviolet
3
9.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
Practical Orchestrator
shlominoach
191
12k
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として見える