Java で書かれた
Android アプリに
Kotlin を適用させていく
2018/02/03
Android Bazaar&Conference,
Diverse 2018 UDON県
@ e-とぴあ香川
辰濱健一
自己紹介
• 辰濱健一(たつはまけんいち)
• 徳島県生まれ、神山町在住
• GDG Shikoku スタッフ
• Sansan 株式会社、名刺アプリ Eight のアプリ開発
• Twitter:@tatsuhama50
• Facebook:kenichi.tatsuhama
2
ブース出してます
3
ラムネ・ステッカー・携帯クリーナー・野菜の種配布中!!
徳島県神山町
4
Sansan株式会社 神山ラボ
5
Kotlin とは?
Kotlin とは
7
• JetBrains 社が開発しているプログラミング言語
• JVM 上で動作する言語で、Java と完全に相互互換がある
• Google I/O 2017 にて、Android の開発言語に選定
Kotlin とは
8
• JetBrains 社が開発しているプログラミング言語
• JVM 上で動作する言語で、Java と完全に相互互換がある
• Google I/O 2017 にて、Android の開発言語に選定
だけじゃない!
Kotlin とは
9
• Native iOS Support
• Web Apps (Ktor)
• Multiplatform Projects(Common Module)
Kotlin とは
10
• Native iOS Support
• Web Apps (Ktor)
• Multiplatform Projects(Common Module)
もう、Kotlin は Android だけじゃない。
サーバも iOS も Kotlin で書ける!
iOS で Kotlin
• DroidKaigi 2018 unofficial iOS app
• https://github.com/kikuchy/DroidKaigi2018iOS
11
iOS で Kotlin
12
Kotlin の特徴
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
14
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
15
Null 安全
• 型で 「null 不許容型」「null 許容型」が分かれる
• Java の String は null 許容型
• → 「 null でない」という状態が型ではわからない
•
• 例)String の場合
• null 許容型:String?
• null 不許容型:String
16
Null 安全
17
• null が来ないことが確実であれば… Java
Kotlin
Null 安全
• 型で null を許容するか否かを表現できる
• NullPointerException がなくなるわけではない!
• 例)Kotlin の関数を Java から呼び出す
• Kotlin の定義が non-null でも、Java から null を渡すことができてしまう…
• → support annotation を付けておこう。
18
Java でも IDE が認識して、null チェックの必要性を判断してくれます
Java
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
19
型の省略
20
Java
Kotlin
Kotlin
※型推論に時間が掛かるので、
型を書いた方が、コンパイルが速い
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
21
ラムダ式
• ラムダ式
• 関数の宣言なしに、関数オブジェクトを生成できる
22
Java
Kotlin
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
23
Data class
• モデルクラスでおなじみの関数を自動生成
• 各 getter, setter, equals, hashCode, …
24
Kotlin
Java
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
25
拡張関数
• 他のクラスに関数を付け加えることができる
26
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
27
便利なコレクション関数
• filter:絞り込み
• map:変換
• sum() :合計
28
Kotlin の特徴
• Null 安全
• 型の省略
• ラムダ式
• data class
• 拡張関数
• 便利なコレクション関数
• デフォルト引数
29
デフォルト引数
• 指定しなかった引数のデフォルト値を指定できる
30
既存の
Android アプリに
Kotlin を
導入していく
Java プロジェクトへ Kotlin を!
• プロジェクト内に Kotlin を部分導入可能(ファイル単位)
• Android Studio の Java to Kotlin コンバータが便利
• Java からの見え方を知っておく
• Java → Kotlin するタイミング
32
Java プロジェクトへ Kotlin を!
• プロジェクト内に Kotlin を部分導入可能(ファイル単位)
• Android Studio の Java to Kotlin コンバータが便利
• Java からの見え方を知っておく
• Java → Kotlin するタイミング
33
Kotlin の部分導入(ファイル単位)
• 同じパッケージ内に java ファイルと kt ファイルの共存が可能
34
Kotlin
Java
Java
Kotlin
Java
Kotlin の部分導入(ファイル単位)
• 1つの Java ファイル内の関数を切り出して、Kotlin で記述す
るという方法も…
35
Java
Java
Kotlin
切り出し
呼出
Java プロジェクトへ Kotlin を!
• プロジェクト内に Kotlin を部分導入可能(ファイル単位)
• Android Studio の Java to Kotlin コンバータが便利
• Java からの見え方を知っておく
36
Convert to Kotlin
37
Convert to Kotlin
38
Java
Kotlin
Convert to Kotlin
• だいぶ Converter も賢くなってきた
• とはいえ、まだまだ過信してはいけない
• Converter が判断できない部分は手直しが必要
• そのままビルドが通とは限らない
• 実行時エラーになることも
39
変換後のエラー
• 例)Parcelable な Model
40
Java
変換後のエラー
41
Convert to Kotlin 後の手直し
• 必要があれば、nullable → non-null に
(String? → String)
• モデルクラスであれば、 data class に
他にも…
• var(書き換え可能な変数) → val (書き換え不可な変数) に
• Kotlin の言語機能(コレクション関数など)に置き換える
42
Java プロジェクトへ Kotlin を!
• プロジェクト内に Kotlin を部分導入可能(ファイル単位)
• Android Studio の Java to Kotlin コンバータが便利
• Java からの見え方を知っておく
• Java → Kotlin するタイミング
43
実行時エラー
44
CREATOR が見つからない???
Java からの見え方に配慮を
• 100% Java と互換性があるとはいえ、
Java からの見え方やコンバート結果は気をつけておく必要が
ある
• 例)
Kotlin にしかない拡張関数も Java から使えて呼べる
→ どうやって Java から呼ぶ??
45
Java から
Kotlin ファイルは
どう見える?
Java から
Kotlin ファイルは
どう見える?
これを知っておけば、Java と Kotlin が混在しても怖くない!!
みてみよう
• Android Studio Tools > Kotlin > Show Kotlin Bytecode
48
みてみよう
49
Kotlin
Kotlin
Bytecode
みてみよう
50
Kotlin
Kotlin
Bytecode
to Java
みてみよう
51
Java
プロパティ
52
JavaKotlin
var プロパティは
setter / getter
が生成されている
val なら getter のみ
プロパティの呼び出し方
53
Kotlin
Java
※public field へのアクセスに見えるが、 getter 経由になっている
Non-null 型
54
JavaKotlin
Non-null 型の実現は
Java から見ると、
アノテーションでの宣言と
null 例外にすぎない!
non-null の Java からの見え方
• アノテーションの付与でしかないので、警告しか出せない
• → コンパイル&実行できて、実行時エラー
55
static 関数の見え方
56
Kotlin
Java
static なCompanion 子クラス内に
関数が生成される
static 関数の呼び出し方
57
Kotlin
Java
※Companion オブジェクト経由の呼び出しになる
static 関数&変数の見え方の制御
58
Java
• 全ての呼び出し元に Companion をつけなければいけない。。。
• Parcelable なオブジェクトは クラス.CREATOR がある前提
(このままでは、クラス.Companion.CREATOR になり、機能しない)
Static 関数の見え方の制御
• @JvmStatic アノテーション
Companion を経由しない static 関数呼び出しを可能にする
59
Book.staticFunction() でアクセス可能
static 変数の見え方の制御
• @JvmField アノテーション
Companion を経由しない static 変数呼び出しを可能にする
60
Parcelable なオブジェクトの
CREATOR フィールドには
@JvmField 付与必須!
拡張関数の見え方
61
Kotlin
Java
拡張関数は、XXKt クラスの static 関数として出力される
拡張関数を呼び出す
62
Java
Kotlin
※第一引数は拡張関数が生えているクラスのインスタンス
デフォルト引数の見え方
63
Kotlin
Java
Java から見える
function(String):引数1つ
は存在しない・・・!?
デフォルト引数の関数を呼ぶために
• @JvmOverloads アノテーション
デフォルト引数なしの関数のオーバロード関数を生成する
64
@JvmOverloads の付与
65
Kotlin Java
Java からの
見え方
まとめ
Java からの見え方
67
項目 Java からの見え方
プロパティ getter / setter
non-null @NotNull アノテーション
null 時に例外を throw する関数
Static 関数 Companion オブジェクト経由呼び出し
or @JvmStatic の付与
Static 変数 Companion オブジェクト経由呼び出し
or @JvmField の付与
拡張関数 XXXKt.function(reciver) 形式での呼び出し
デフォルト引数 @JvmOverloads の付与
Java プロジェクトへ Kotlin を!
• プロジェクト内に Kotlin を部分導入可能(ファイル単位)
• Android Studio の Java to Kotlin コンバータが便利
• Java からの見え方を知っておく
• Java → Kotlin するタイミング
68
Java → Kotlin するタイミング
• 基本的に大きな機能修正をする場合に行う
(Kotlin 変換だけのリファクタはほぼしない。開発&テストされる機会に変換する)
• する場合も、1ファイルごとに動作確認しながら
• Java ファイルの数行の編集なら、Java で書く
(レビューコストがかさまないように)
• モデルクラスは、触るタイミングで Kotlin に移行しても安心
(機能がシンプル、レビューも容易)
※新規コードは全て Kotlin で書いています
69
Java → Kotlin の例
• 例)Parcelable なオブジェクト
70
Java
Kotlin
Java → Kotlin の例
• 例)Parcelable なオブジェクト
71
Java
Kotlin
↓エラー修正
Java → Kotlin の例
• 例)Parcelable なオブジェクト
72
ちゃんと Java から見えるように
Java → Kotlin の例
• 例)Parcelable なオブジェクト
73
↓Kotlin の機能を使う(Single Expression)
Java → Kotlin の例
• 例)Parcelable なオブジェクト
74
まだ長い…
さらに、Kotlin の
機能を使うと…!
Java → Kotlin の例
• 例)Parcelable なオブジェクト
75
これだけ(実質2行)で OK !
※まだ Experimental な Kotlin Extensions の @Parcelize を使っています
Java からの
見え方を意識すれば、
Kotlin のプロジェクト
投入も怖くない!
Let’s enjoy Kotlin
告知
DroidKaigi 参加報告会
• 2/8(木), 9(金) に東京で開催される DroidKaigi 2018 の参加
報告会を開催します
• 日時:2/25(日) 13:00〜17:00
• 場所:大同生命徳島ビル 1 階(徳島駅周辺)
• 申込:GDG Shikoku の Compass にて!
80
Java で書かれた Android アプリに Kotlin を適用させていく

Java で書かれた Android アプリに Kotlin を適用させていく