$30 off During Our Annual Pro Sale. View Details »

Kotlin Inline Class

Kotlin Inline Class

Takuji Nishibayashi

April 12, 2019
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. KotlinͷInline classΛAndroidΞϓϦ
    Ͱ׆༻͢Δ
    @takuji31
    Mobile Act OSAKA #9

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. ࣗݾ঺հ
    • @takuji31 id:takuji31
    • Takuji Nishibayashi
    • Hatena Co., Ltd.
    • App Team
    • ίϛοΫDAYS
    • δϟϯϓϧʔΩʔʂ
    • ΧΫϤϜ

    View Slide

  4. ࣗݾ঺հ
    • Android
    • Kotlin
    • Flu-er

    !
    h-ps:/
    /blog.takuji31.jp

    "
    h-ps:/
    /nazuna.takuji31.jp

    # $
    h-ps:/
    /photo.takuji31.jp

    View Slide

  5. ಥવͰ͕࣭͢໰Ͱ͢

    View Slide

  6. AndroidΞϓϦ
    ։ൃͯ͠·͔͢ʁ

    View Slide

  7. Kotlin
    ࢖ͬͯ·͢ΑͶʁ

    View Slide

  8. ࢖͍·͢ΑͶʁ

    View Slide

  9. ಛผͳҙຯΛ࣋ͭ
    ϓϦϛςΟϒܕͷ஋
    ͋Γ·͢ΑͶʁ

    View Slide

  10. ྫ͑͹

    View Slide

  11. ID

    View Slide

  12. ೔෇

    View Slide

  13. ೔࣌

    View Slide

  14. URLͷςϯϓϨʔτ

    View Slide

  15. APIͰड͚औͬͨΓ

    View Slide

  16. ը໘ͷύϥϝʔλʔʹͨ͠Γ

    View Slide

  17. ྫ͑͹ID͕શ෦Stringͩͱ
    Α͘෼͔Βͳ͍

    View Slide

  18. ͏͔ͬΓϢʔβʔͷID౉͢΂͖ͱ͜
    Ζʹ
    ผͷIDΛ౉ͯ͠͠·͏

    View Slide

  19. ܕͰͳΜͱ͔͍ͨ͠

    View Slide

  20. Inline class

    View Slide

  21. Inline class
    • ࡞Γํ
    • APIͷϨεϙϯεͰ
    • ը໘ͷύϥϝʔλʔͱͯ͠

    View Slide

  22. ࡞Γํ

    View Slide

  23. Inline class UserId(
    val value: String // single value only
    )

    View Slide

  24. ؆୯Ͱ͢Ͷ

    View Slide

  25. APIͷϨεϙϯεͰ

    View Slide

  26. {
    "id": "1234567890",
    "name": "takuji31",
    "iconUrlTemplate": "https://takuji31.jp/icon.png?size={size}",
    "lastLoggedInAt": "2019-04-09T01:23:45+09:00",
    "birthday": "1987-03-01"
    }

    View Slide

  27. No Inline classes
    data class User(
    val id: String,
    val name: String,
    val iconUrlTemplate: String,
    val lastLoggedInAt: String,
    val birthday: String
    )

    View Slide

  28. With Inline classes
    data class User(
    val id: UserId,
    val name: String,
    val iconUrlTemplate: UrlTemplate,
    val lastLoggedInAt: DateTimeString,
    val birthday: DateString
    )

    View Slide

  29. Parse͢Δ

    View Slide

  30. kotlinx.serializa.on

    View Slide

  31. Not supported

    View Slide

  32. Gson

    View Slide

  33. JavaͷReflec(onͰ͸
    ݩͷܕͱͯ͠ೝࣝ͞ΕΔ
    →Կ΋͠ͳͯ͘Α͍

    View Slide

  34. Moshi

    View Slide

  35. Reflec%on

    View Slide

  36. Not supported

    View Slide

  37. Codegen

    View Slide

  38. objectͱͯ͠ೝࣝ͠Α͏ͱ͢Δ→ࢮ

    View Slide

  39. AdapterΛ࡞Δ

    View Slide

  40. ࣗಈੜ੒Ͱ͖Δͱ͍͍͔΋ʁ

    View Slide

  41. APIͷϨεϙϯεͰ
    • ఆٛ͸؆୯
    • ࢖͏ͷ΋؆୯
    • γϦΞϥΠζ͢Δ࣌͸πʔϧΛબͼͦ͏
    • Gson
    • Moshi Codegen + Կ͔ͰAdapterੜ੒

    View Slide

  42. ը໘ͷύϥϝʔλʔͱͯ͠

    View Slide

  43. Jetpack Naviga-on
    Safe Args

    View Slide

  44. android:id="@+id/user"
    android:name="jp.takuji31.inline.UserFragment" >
    android:name="id"
    app:argType="jp.takuji31.inline.UserId" />

    View Slide

  45. ͦͷ··ͩͱSafe ArgsʹInline class
    ͕౉ͤͳ͍

    View Slide

  46. Serializableʹ͢Δ

    View Slide

  47. inline class UserId(val value: String) : Serializable

    View Slide

  48. fun openUserScreen(user: User) {
    findNavController()
    .navigate(
    R.id.action_home_to_user,
    UserFragmentArgs(user.id).toBundle()
    )
    }

    View Slide

  49. private val args: UserFragmentArgs by navArgs()
    override fun oncreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val userId = args.id
    // do something
    }

    View Slide

  50. h"ps:/
    /github.com/takuji31/inline-
    class-example

    View Slide

  51. ExperimentalͳͷͰ
    ͝ར༻͸ܭըతʹ

    View Slide

  52. data classͰ୅༻͢Δͷ΋
    ͝ݕ౼͍ͩ͘͞

    View Slide

  53. enjoy Inline class life

    View Slide

  54. !
    ࠾༻৘ใ

    View Slide

  55. גࣜձࣾ͸ͯͳͰ͸ɺ
    ͱ΋ʹʮ௅ઓʯͰ͖Δ
    ஥ؒΛืू͍ͯ͠·͢

    View Slide

  56. ͜ΜͳਓΛ୳͍ͯ͠·͢
    • AndroidΞϓϦΛ࡞Γ͍ͨਓ
    • iOSΞϓϦΛ࡞Γ͍ͨਓ
    • ͋Δ͍͸྆ํ
    • ͳΜͳΒαʔόʔαΠυ΋

    View Slide

  57. h"ps:/
    /hatenacorp.jp/recruit/

    View Slide