Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Javaͱͷ਌࿨ੑʁ

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

ɹͱɾ͜ɾΖɾͰ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

ͬͯࢥ͍ͬͯ·ͤΜ͔ʁ

Slide 11

Slide 11 text

KotlinͰ΋ NullPointerExcep/on ى͖·͢

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

ࣗݾ঺հ

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Kotlinͱnull جຊͷ͓͞Β͍

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

ͯ͞

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

͚ΕͲɺ

Slide 35

Slide 35 text

KotlinͰ΋ NullPointerExcep/on ى͖·͢ʂ

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

ͦ͏ɺKotlin͚ͩͰॻ͘ͳΒ

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Java

Slide 43

Slide 43 text

JavaʹString?ͱ͔ɺͳ͍

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

΍͹͍ʂ

Slide 53

Slide 53 text

KotlinͰ΋ NullPointerExcep/on ى͖·͢ʂ

Slide 54

Slide 54 text

΋͏গ͠ৄ͘͠ݴ͏ͱ

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

Τϥʔ͸2ύλʔϯ

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

ͱ͸͍͑

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

@NotNull'ͱ'@Nullable

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

ͪͳΈʹ࣮͸ෳ਺ରԠ͍ͯ͠Δ • 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

Slide 87

Slide 87 text

ϙΠϯτ͓͞Β͍

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

Kotlin͸͍͍ݴޠͰ͢

Slide 92

Slide 92 text

Kotlinେ޷͖Ͱ͢

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

͔͜͜Βઌ͸༨ஊͰ͢

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

KotlinͰ΋ NullPointerExcep/on ى͖·͢

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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