Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,639 views

Published on

2017/11/18
DevFest Shikoku 2017@徳島大学

Published in: Software
  • Be the first to comment

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

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

×