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
740
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
1.3k
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.3k
#Ubie 狂気の認知施策と選考設計
ntaro
13
14k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.2k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.6k
Kotlinでサーバサイドを始めよう!
ntaro
1
1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.9k
Kotlin Contracts #m3kt
ntaro
4
4.3k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
540
Other Decks in Programming
See All in Programming
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
360
AI活用のコスパを最大化する方法
ochtum
0
130
文字コードの話
qnighy
44
17k
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
110
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
480
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
370
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
970
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
240
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
530
Claude Code Skill入門
mayahoney
0
200
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
170
SourceGeneratorのマーカー属性問題について
htkym
0
180
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
100
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
RailsConf 2023
tenderlove
30
1.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
940
The World Runs on Bad Software
bkeepers
PRO
72
12k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
140
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Mind Mapping
helmedeiros
PRO
1
120
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Site-Speed That Sticks
csswizardry
13
1.1k
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として見える