Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan
Search
Taro Nagasawa
June 29, 2017
Programming
770
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
3.1k
Kotlin Contracts #m3kt
ntaro
4
4.4k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
590
Other Decks in Programming
See All in Programming
The Rails Doctrine Decade
koic
2
410
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
410
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
18
19k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
230
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
360
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4.6k
AWSに止められる覚悟してますか?
morizo_1984
2
480
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
360
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
420
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
WENDY [Excerpt]
tessaabrams
14
39k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Ethics towards AI in product and experience design
skipperchong
2
400
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
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として見える