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

プラットホーム型について ~Kotlinだって間違えるとnullでハマるよ!~

プラットホーム型について ~Kotlinだって間違えるとnullでハマるよ!~

2017/07/24

『2017年7月定例会「Kotlin & Android Studio 3.0」』

の発表資料です

RyotaMurohoshi

July 24, 2017
Tweet

More Decks by RyotaMurohoshi

Other Decks in Technology

Transcript

  1. ϓϥοτϗʔϜܕʹ͍ͭͯ
    ~Kotlinͩͬͯؒҧ͑ΔͱnullͰϋϚΔΑʂ~
    @RyotaMurohoshi
    2017/07/24ʮKotlin-&-Android-Studio-3.0ʯ

    View Slide

  2. Kotlinͷ͍͍ͱ͜Ζͱ͍͑͹
    ԿΛࢥ͍ු͔΂·͔͢ʁ

    View Slide

  3. ίʔυ͕؆ܿʹॻ͚Δͱ͜Ζʁ

    View Slide

  4. Javaͱͷ਌࿨ੑʁ

    View Slide

  5. nullΛ͍͍ײ͡ʹѻ͑Δͱ͜Ζʁ

    View Slide

  6. KotlinͷެࣜυΩϡϝϯτʹ͸
    ͜Μͳϖʔδ΋͋Γ·͢Ͷ

    View Slide

  7. Null$Safety
    h"ps:/
    /kotlinlang.org/docs/reference/null6safety.html

    View Slide

  8. ɹͱɾ͜ɾΖɾͰ

    View Slide

  9. KotlinͩͬͨΒ
    NullPointerExcep/on
    ͕ى͖ͳ͍

    View Slide

  10. ͬͯࢥ͍ͬͯ·ͤΜ͔ʁ

    View Slide

  11. KotlinͰ΋
    NullPointerExcep/on
    ى͖·͢

    View Slide

  12. KotlinͰ΋
    NullPointerExcep/on
    ى͖·͢ʂʂʂ

    View Slide

  13. ͚ΕͲKotlin͕ѱ͍Θ͚Ͱ͸ͳ͘
    ࢖͍ํ͕ؒҧ͍ͬͯΔͷͰ͢

    View Slide

  14. • ࠷ۙKotlinΛ৮Γ࢝Ίͨ
    • Googleͷൃද͔ΒKotlinʹڵຯΛ࣋ͬͯ৮Γ࢝Ίͨ
    • ڈ೥͋ͨΓ͔ΒͳΜͱͳ͘Kotlinؾʹͳͬͯ৮Γ࢝Ίͨ
    ࠓ೔͸͜ͷΑ͏ͳํʹ޲͚ͯ

    View Slide

  15. Android+Kotlin΍Δ্Ͱ
    Ͳ͏ͯ͠΋஌͓͍͍͖͍ͬͯͯͨͩͨɺ

    View Slide

  16. KotlinͱnullͱϓϥοτϗʔϜʹ͍ͭͯ
    ൃද͍͖ͤͯͨͩ͞·͢

    View Slide

  17. ͜Ε͔Β͓࿩͢Δ͜ͱ͸
    Kotlinͷ͍͚ͯΔݴޠػೳͰ΋
    Android+Kotlinͷ͍͚ͯΔϊ΢ϋ΢Ͱ΋͋Γ·ͤΜ

    View Slide

  18. ͚ΕͲɺ͜Ε͔Β͓࿩͢Δ͜ͱΛཧղ͢Ε͹
    όάΛੜΜͰ͠·͏͜ͱΛආ͚ΒΕΔ͔΋͠Ε·ͤΜ

    View Slide

  19. ࣗݾ঺հ

    View Slide

  20. • @RyotaMurohoshi
    • ΉΖ΄͠
    • Kotlinॿ૸ಡຊʹࢀՃ
    • ͔Θ͍͍Kotlinͱ͔Sansan༷ͷษڧձͰLT

    View Slide

  21. Kotlinͱͷग़ձ͍͸
    @ngsw_taro͞Μͷ͋ΔΠϕϯτͰͷ
    Kotlinͱnullʹؔ͢ΔLTͰͨ͠

    View Slide

  22. Kotlinͱnull
    جຊͷ͓͞Β͍

    View Slide

  23. Stringܕʹnull͸୅ೖͰ͖ͳ͍
    // ίϯύΠϧΤϥʔ
    val str: String = null

    View Slide

  24. String?ܕͳΒ͹null͸୅ೖͰ͖Δ
    // OK
    val str: String? = null

    View Slide

  25. String΋͘͠͸nullΛฦ͢readMessage
    ฦ஋ܕ͸ʮString?ʯܕʹ͢Δ
    fun readMessage(): String? {
    // จࣈྻϦςϥϧΛฦ͔͢΋
    // nullΛฦ͔͢΋
    // ུ
    }

    View Slide

  26. String͕null͔΋͠Εͳ͍
    ͱ͍͏ͱ͖͸String?Λ
    ࢖Θͳ͍ͱ͍͚ͳ͍

    View Slide

  27. ͯ͞

    View Slide

  28. StringܕʹString?͸୅ೖͰ͖ͳ͍
    // ࣍ͷؔ਺͸
    // StringϦςϥϧΛฦ͔͢΋͠Εͳ͍͠
    // nullΛฦ͔͢΋͠Εͳ͍
    fun readMessage(): String? {
    // ུ
    }
    // ίϯύΠϧΤϥʔ
    val message: String = readMessage()

    View Slide

  29. String?ܕʹString͸୅ೖͰ͖Δ
    // ࣍ͷؔ਺͸
    // StringΛฦ͢
    fun findTag(): String {
    // ུ
    }
    // ࣍͸OK
    val tag: String? = findTag()

    View Slide

  30. nullʹ·ͭΘΔϥϯλΠϜΤϥʔΛ
    ආ͚ΔͨΊͷૉఢݴޠ࢓༷

    View Slide

  31. val message: String? = readMessage()
    // ࣍͸ίϯύΠϧΤϥʔ
    // String?ͰJavaΈ͍ͨͳॻ͖ํ͸Ͱ͖ͳ͍
    val messageLength: Int = message.length
    // ࣍͸ίϯύΠϧΤϥʔʹ͸ͳΒͳ͍͕
    // message͕nullͳΒ͹ϥϯλΠϜΤϥʔ
    val messageLength: Int = message!!.length
    // ࣍͸OK
    // messageLength͸IntܕͰͳ͘Int?ܕ
    val messageLength: Int? = message?.length

    View Slide

  32. String?ܕͰ͸JavaΈ͍ͨͳ
    ϝϯόΞΫηε͸Ͱ͖ͳ͍
    ݪଇɺʮ?.ʯΛ࢖͏
    ΋͘͠͸ϥϯλΠϜΤϥʔʹͳΔՄೳੑͷ͋Δʮ!!.ʯ

    View Slide

  33. ͳΔ΄ͲNullPointerExcep/onൃੜ͠ͳͦ͏
    • Stringܕʹnull͸୅ೖͰ͖ͳ͍
    • null͔΋͠Εͳ͍ͱ͍͏࣌͸String?
    • StringͱString?͸ผ
    • String?͸?.Ͱ

    View Slide

  34. ͚ΕͲɺ

    View Slide

  35. KotlinͰ΋
    NullPointerExcep/on
    ى͖·͢ʂ

    View Slide

  36. ͔ͨ͠ʹ
    Kotlin͚ͩͰίʔυΛॻ͘ͷͳΒ͹
    ͦ͏ͦ͏NullPointerExcep/on͸ൃੜ͠ͳ͍

    View Slide

  37. ͦ͏ɺKotlin͚ͩͰॻ͘ͳΒ

    View Slide

  38. օ͞Μࣗ਎͕ॻ͘ίʔυΛશͯ
    Kotlinʹ͢Δ͜ͱ͸Ͱ͖ͦ͏Ͱ͢Ͷ

    View Slide

  39. ͦ͏͍͑͹ɺࠓ೔͸AndroidͷձͷΠϕϯτͰͨ͠Ͷ

    View Slide

  40. ͱ͜ΖͰɺօ͞ΜAndroidΞϓϦ։ൃ

    View Slide

  41. ϥΠϒϥϦ࢖͍·͢ΑͶʁ
    ϑϨʔϜϫʔΫ࢖͍·͢ΑͶʁ

    View Slide

  42. Java

    View Slide

  43. JavaʹString?ͱ͔ɺͳ͍

    View Slide

  44. JavaͷίʔυΛݺͼग़͢Օॴ
    ཁ஫ҙʂ

    View Slide

  45. ͜ΜͳJavaͷίʔυΛ
    Kotlin͔Βݺͼग़ͨ͠ΒͲ͏ͳΔͩΖ͏ʁ
    // ͜Ε͸JavaͰ͢
    public class Reader {
    public static String readNullableStringJava() {
    return null;
    }
    }

    View Slide

  46. Kotlin͔Βݺͼग़͢ͱɻɻɻ
    // ͜Ε͸ίϯύΠϧΤϥʔʹͳΒͳ͍
    val str = Reader.readNullableStringJava()
    // ͜Ε΋ίϯύΠϧΤϥʔʹͳΒͳ͍
    val str : String? = Reader.readNullableStringJava()
    // ஫໨ʂ͜Ε΋ίϯύΠϧΤϥʔʹͳΒͳ͍ʂʂʂ
    val str : String = Reader.readNullableStringJava()

    View Slide

  47. શ෦OK
    ίϯύΠϧΤϥʔʹͳΒͳ͍

    View Slide

  48. Ͱ΋ͪΐͬͱ଴͍ͬͯͩ͘͞

    View Slide

  49. ʲ࠶ܝʳ͜ΜͳJavaͷίʔυΛ
    Kotlin͔Βݺͼग़ͨ͠ΒͲ͏ͳΔͩΖ͏ʁ
    // ͜Ε͸JavaͰ͢
    public class Reader {
    public static String readNullableStringJava() {
    return null;
    }
    }

    View Slide

  50. ʲ࠶ܝʳKotlin͔Βݺͼग़͢ͱɻɻɻ
    // ͜Ε͸ίϯύΠϧΤϥʔʹͳΒͳ͍
    val str = Reader.readNullableStringJava()
    // ͜Ε΋ίϯύΠϧΤϥʔʹͳΒͳ͍
    val str : String? = Reader.readNullableStringJava()
    // ஫໨ʂ͜Ε΋ίϯύΠϧΤϥʔʹͳΒͳ͍ʂʂʂ
    val str : String = Reader.readNullableStringJava()

    View Slide

  51. nullΛString?͡Όͳͯ͘
    Stringܕͷม਺ʹ୅ೖ͍ͯ͠Δ

    View Slide

  52. ΍͹͍ʂ

    View Slide

  53. KotlinͰ΋
    NullPointerExcep/on
    ى͖·͢ʂ

    View Slide

  54. ΋͏গ͠ৄ͘͠ݴ͏ͱ

    View Slide

  55. Javaͱͷڥք෦Ͱద੾ͳίʔυΛॻ͔ͳ͍ͱ
    ίϯύΠϧ͸௨Δ͚ΕͲ
    ࣮ߦ࣌ʹIllegalStateExcep,on΍NullPointerExcep,on͕ൃੜ

    View Slide

  56. Τϥʔ͸2ύλʔϯ

    View Slide

  57. ύλʔϯͦͷ1
    IllegalStateExcep,on͕ൃੜ

    View Slide

  58. Javaͷίʔυ
    public class Reader {
    public static String readNullableStringJava() {
    return null;
    }
    }
    Kotlinͷίʔυ
    // ͜ͷ୅ೖͨ͋ͨ͠ΓͰIllegalStateExceptionൃੜ
    val str : String = Reader.readNullableStringJava()

    View Slide

  59. ύλʔϯ1͸
    Java͔Β͖ͨnullΛKotlinͷStringܕͷม਺ʹ୅ೖͨ࣌͠఺Ͱ
    IllegalStateExcep,on͕ൃੜ

    View Slide

  60. ύλʔϯͦͷ2
    NullPointerExcep/on͕ൃੜ

    View Slide

  61. Javaͷίʔυ
    public class Reader {
    public static String readNullableStringJava() {
    return null;
    }
    }
    Kotlinͷίʔυ
    // ͜ͷ୅ೖΛͨ͋ͨ͠ΓͰ͸ϥϯλΠϜΤϥʔ͸ൃੜ͠ͳ͍
    val str = Reader.readNullableStringJava()
    // ͜͜ͰNullPointerExceptionͰࢮ͵
    val length = str.length

    View Slide

  62. ύλʔϯ2͸
    Java͔Β͖ͨnullΛKotlinͰܕΛ໌ࣔతʹએݴ͠ͳ͍ม਺ʹ୅ೖ
    ͦͯ͠ϝϯόΞΫηεͨ࣌͠఺ͰNullPointerExcep/onͰࢮ͵

    View Slide

  63. Javaͱͷڥք෦Ͱద੾ͳίʔυΛॻ͔ͳ͍ͱ
    ίϯύΠϧ͸௨Δ͚ΕͲ
    ࣮ߦ࣌ʹIllegalStateExcep,on΍NullPointerExcep,on͕ൃੜ

    View Slide

  64. Ͳͬͪ΋Java͔Βདྷͨnull͕ݪҼ
    JavaͷString͕KotlinͷString?͡Όͳ͍
    ͔Β͜͏͍͏͜ͱʹ

    View Slide

  65. ϙΠϯτ͸ϓϥοτϗʔϜܕʂ

    View Slide

  66. JavaͰͷࢀরܕ͸KotlinͰ͸ಛผѻ͍͞ΕΔ
    ͜Ε͕ϓϥοτϗʔϜܕ

    View Slide

  67. ϓϥοτϗʔϜܕ͸
    • IDEͱ͔ͰString!ͱ͔ͬͯද͞ΕΔ΍ͭ
    • ίʔυ্Ͱ͸ɺܕΛ໌ࣔతʹString!ͱ͸ॻ͚ͳ͍
    • String!͸Stringʹ΋String?ʹ΋୅ೖͰ͖Δ
    • ਪ࿦͞ΕͯString!ͰѻΘΕΔ৔߹͕͋Δ

    View Slide

  68. Kotlin͔ΒݟΔͱฦ஋ܕ͸
    ϓϥοτϑΥʔϜܕͷString!
    public class Reader {
    public static String readNullableStringJava() {
    return null;
    }
    }

    View Slide

  69. Kotlin͔Βݺͼग़͢ͱɻɻɻ
    // Լͷstr͸ϓϥοτϗʔϜܕͷString!
    // ͚ͲString!ͬͯ໌ࣔతʹ͸ॻ͚ͳ͍
    val str = Reader.readNullableStringJava()
    // String?ܕͷม਺ʹ୅ೖ
    val str : String? = Reader.readNullableStringJava()
    // Stringܕͷม਺ʹ୅ೖ
    val str : String = Reader.readNullableStringJava()

    View Slide

  70. • String!ܕ(໌ࣔతʹॻ͔ͣਪ࿦͞ΕΔ)
    • String?ܕ(໌ࣔతʹએݴ)
    • Stringܕ(໌ࣔతʹએݴ)
    ͦΕͧΕͷ৔߹Ͳ͏ͳΔʁ

    View Slide

  71. ͦͷ1"String!ܕ(ϓϥοτϑΥʔϜܕ)
    // Լ͸ϓϥοτϑΥʔϜܕͷString!
    val str = Reader.readNullableStringJava()
    // ίϯύΠϧΤϥʔͰͳ͍͠ɺ࣮ߦ࣌Τϥʔʹ΋ͳΒͳ͍
    println(str?.length)
    // ίϯύΠϧΤϥʔʮͰ͸ʯͳ͍͚Ͳɺ
    // ࣮ߦ࣌ʹNullPointerExceptionൃੜ
    println(str.length)

    View Slide

  72. ͦͷ2ɹString?ܕ
    // Լ͸Stringܕ
    val str: String? = Reader.readNullableStringJava()
    // OK
    println(str?.length)
    // ίϯύΠϧΤϥʔ
    println(str.length)

    View Slide

  73. ͦͷ3ɹStringܕ
    // Լ͸Stringܕ
    // ίϯύΠϧΤϥʔʹ͸ͳΒͳ͍
    // ୅ೖͨ͋ͨ͠ΓͰIllegalStateException͕ൃੜ
    val str: String = Reader.readNullableStringJava()
    // ͦΕඞཁͳ͍Αͬͯɺܯࠂ͕ग़Δ
    println(str?.length)
    // OK
    println(str.length)

    View Slide

  74. ϓϥοτϑΥʔϜܕΛ͔ͬ͠Γཧղʂ
    ಛʹܕΛ໌ࣔతʹએݴ͠ͳ͍Ͱ
    ϓϥοτϑΥʔϜܕͷ··ѻ͏৔߹ʹ஫ҙ

    View Slide

  75. Javaͱͷڥք෦Ͱద੾ͳίʔυΛॻ͔ͳ͍ͱ
    ίϯύΠϧ͸௨Δ͚ΕͲ
    ࣮ߦ࣌ʹIllegalStateExcep,on΍NullPointerExcep,on͕ൃੜ

    View Slide

  76. ͱΓ͋͑ͣString!ʢϓϥοτϑΥʔϜܕʣ͸ɺ
    String?Λ໌ࣔతʹએݴͨ͠ม਺Ͱड͚͓͚ͯ͹
    ϥϯλΠϜΤϥʔ͸ൃੜ͠ͳ͍

    View Slide

  77. ͱ͸͍͑

    View Slide

  78. ໌Β͔ʹnull͡Όͳ͍΋ͷ΋͋Δ
    ͍͍ͪͪString?Ͱड͚ΔͷΊΜͲ͍

    View Slide

  79. ΋͘͠͸Javaͷίʔυଆ͔Β
    String?Ͱड͚Δ͜ͱΛڧ੍͍ͨ͠

    View Slide

  80. @NotNull'ͱ'@Nullable

    View Slide

  81. Javaͷίʔυʹ@NotNullΛ͚ͭΔͱ
    KotlinͰTͱͯ͠ѻΘΕΔ
    @NotNull
    public static String readNotNull() {
    return "";
    }

    View Slide

  82. // IDE͕ɺฦΓ஋ܕ͸Stringͬͯڭ͑ͯ͘ΕΔʢString!Ͱ͸ͳ͍ʣ
    val str = Reader.readNotNull()
    // ͜Ε΋OK
    val str : String = Reader.readNotNull()
    // ࣮͸ɺ͜Ε΋OK
    val str : String? = Reader.readNotNull()

    View Slide

  83. Javaͷίʔυʹ@NullableΛ͚ͭΔͱ
    KotlinͰT?ͱͯ͠ѻΘΕΔ
    @Nulllable
    public static String readNullable() {
    return null;
    }

    View Slide

  84. // IDE͕ɺฦΓ஋ܕ͸String?ͬͯڭ͑ͯ͘ΕΔʢString!Ͱ͸ͳ͍ʣ
    val str = Reader.readNullable()
    // ͜Ε΋OK
    val str : String? = Reader.readNullable()
    // ͜Ε͸ίϯύΠϧΤϥʔ
    val str : String = Reader.readNullable()

    View Slide

  85. ΋͋͠ͳ͕ͨJavaͷϥΠϒϥϦΛॻ͍͍ͯΔͳΒ͹
    ͥͻ@NotNullͱ@NullableΛద੾ʹ͚ͭͯΈ͍ͯͩ͘͞
    h"ps:/
    /kotlinlang.org/docs/reference/java7interop.html#nullability7annota=ons

    View Slide

  86. ͪͳΈʹ࣮͸ෳ਺ରԠ͍ͯ͠Δ
    • android.support.annota-on.Nullable
    • com.android.annota-ons.Nullable
    • org.eclipse.jdt.annota-on.Nullable
    • org.checkerframework.checker.nullness.qual.Nullable
    • org.jetbrains.annota-ons.Nullable

    View Slide

  87. ϙΠϯτ͓͞Β͍

    View Slide

  88. ϙΠϯτ1
    Javaͱͷڥք෦Ͱద੾ͳίʔυΛॻ͔ͳ͍ͱ
    ίϯύΠϧ͸௨Δ͚ΕͲ
    ࣮ߦ࣌ʹIllegalStateExcep,on΍NullPointerExcep,on͕ൃੜ

    View Slide

  89. ϙΠϯτ2
    ϓϥοτϑΥʔϜܕΛ͔ͬ͠Γཧղʂ
    ಛʹܕΛ໌ࣔతʹએݴ͠ͳ͍Ͱ
    ϓϥοτϑΥʔϜܕͷ··ѻ͏৔߹ʹ஫ҙ

    View Slide

  90. ϙΠϯτ3
    ΋͋͠ͳ͕ͨJavaͷϥΠϒϥϦΛॻ͍͍ͯΔͳΒ͹
    ͥͻ@NotNullͱ@NullableΛద੾ʹ͚ͭͯΈ͍ͯͩ͘͞

    View Slide

  91. Kotlin͸͍͍ݴޠͰ͢

    View Slide

  92. Kotlinେ޷͖Ͱ͢

    View Slide

  93. ࠓ೔ͷ໨ඪ͸ɺKotlinΛ࠷ۙ࢝Ίͨਓ͕
    ʮKotlinͰ΋NullPointerExcep0onͰΔ͡ΌΜʔʂʯ
    ͱ͍͏ࣄނΛ๷͙͜ͱͰͨ͠

    View Slide

  94. ʮKotlinͩͬͯؒҧ͑ΔͱnullͰϋϚΔʂʯ
    ͜Ε͕1݅Ͱ΋ݮΕ͹͏Ε͍͠Ͱ͢

    View Slide

  95. ͔͜͜Βઌ͸༨ஊͰ͢

    View Slide

  96. ʮKotlinΛͻΖΊͯߦ͜͏ʂʯ
    ͬͯਓɺ஫໨͍ͯͩ͘͠͞

    View Slide

  97. ʮnull$safetyͬͯԿͰ͔͢Ͷʁʯ

    View Slide

  98. KotlinͰ΋NullPointerExcep0on
    ͸ൃੜ͠·͢
    !!΋ͦ͏ͩ͠ɺॳظԽλΠϛϯάͰൃੜ͢Δ͜ͱ΋͋Δ

    View Slide

  99. ๻͸ʮnull$safetyʯ͸
    NullPointerExcep/on͕ൃੜ͠ͳ͍͜ͱ
    Ͱ͸ͳͯ͘

    View Slide

  100. nullΛѻ͍΍͍͢ݴޠ࢓༷ɾػೳʹΑΓ
    NullPointerExcep/on͕ൃੜͮ͠Β͍
    ͜ͱͩͱࢥ͍ͬͯ·͢

    View Slide

  101. KotlinͰ΋
    NullPointerExcep/on
    ى͖·͢

    View Slide

  102. Kotlin͕nullʹ·ͭΘΔ໰୊Λ
    ͍͍ײ͡ʹղܾͰ͖Δ͚ΕͲ
    ͜ͷϙΠϯτ͸๨Εͳ͍Ͱ͍ͩ͘͞

    View Slide

  103. ʮnull҆શݴޠͬͯԿͰ͔͢Ͷʁʯ

    View Slide

  104. ๻͸ʮnull҆શݴޠʯͱ͍͏ݴ༿Λ
    ϒϩά΍SNS΍هࣄͰ࢖Θͳ͍Α͏ʹ͍ͯ͠·͢

    View Slide

  105. • ੩తܕ෇͚ݴޠ
    • ΫϥεϕʔεͷΦϒδΣΫτࢦ޲ݴޠ
    • JVMݴޠ
    ͜͏͍͏ݴ༿ͱҧͬͯ໌֬ͳఆٛͱ͔
    ڞ௨ೝࣝͱ͔͕ͦ͜·Ͱͳ͍ͱࢥ͏ΜͰ͢Α

    View Slide

  106. ࢖͏࣌͸ͥͻɺఆٛΛॻ͍ͯΈ͍ͯͩ͘͞
    ͦͯͦ͠ͷࡍ͸ɺϓϥοτϑΥʔϜܕʹ͍ͭͯ΋ʂ

    View Slide

  107. ͓·͚1
    ϓϥοτϑΥʔϜܕؔ࿈ͷίʔυ
    IDEAͰɺTools)>)Kotlin)>)Show)Kotlin)Bytecode
    ͯ͠ɺDecompile͢Δͱ໘ന͍ͷͰΈͯΈ͍ͯͩ͘͞

    View Slide

  108. ͓·͚2
    ϓϥοτϑΥʔϜܕҎ֎Ͱ΋
    ΠϯελϯεͷॳظԽؔ࿈Ͱ
    NullPointerExcep/on͕ൃੜ

    View Slide