Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan

JavaからKotlinへの移行(プラットフォーム型) #Kotlin_Sansan

第6回 Kotlin勉強会@Sansan( https://sansan.connpass.com/event/57683/ )で使用したスライドです。

Taro Nagasawa

June 29, 2017
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

  1. Null安全 • nullの可能性のあるものと、そうでないものを厳格に区別する ことでケアレスミスを防ぐ val a: Int = null //

    コンパイルエラー val b: Int? = null // OK b.toString() // コンパイルエラー if (b != null) b.toString() // OK b?.toString() // OK
  2. Javaコードの呼び出し結果はハテナだらけ? val foo: File = File("/") val bar: File? =

    foo.absoluteFile val baz: File? = foo.parentFile コンストラクタの 戻り値はNotNull getXxx()メソッドは xxxプロパティのように
  3. Javaコードの呼び出し結果はハテナだらけ? val foo: File = File("/") val bar: File? =

    foo.absoluteFile val baz: File? = foo.parentFile 常にnullを返さないメソッドもあ るのに面倒だな
  4. プラットフォーム型 • nullかもしれないし、nullじゃないかもしれない型 • 受ける型を省略することで、プラットフォーム型を維持 • 例えば「File!」として表記される val baz =

    foo.parentFile baz.exists() //=> ぬるぽ File!が返される 型を省略しているので File!のまま 危険な操作であるにも関わらず普通に メンバアクセス可能 (上手く行くこともあるが、今回はぬるぽ)
  5. ifでnullチェックして回避 val baz = foo.parentFile if (baz != null) baz.exists()

    else false Javaと 変わらん!! ※プラットフォーム型 + nullチェックはJavaと同じだが、 Nullable + nullチェックはJavaよりも安全。nullチェックを 否定したいわけではないことに注意。
  6. だったらNullableとして明示すりゃあいい val baz: File? = foo.parentFile // あとはご自由に • とにかく安全!

    • プラットフォーム型の存在意義とは • 結局ハテナだらけで面倒問題に戻る →注意深くコーディングして、うっかり死ぬよりマシ
  7. 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として見える