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

Writing Java-friendly Kotlin code

Writing Java-friendly Kotlin code

В то время как Kotlin становится всё более популярным, всё больше Java-библиотек обзаводятся Kotlin-обёртками, чтобы сделать их использование в Kotlin-коде более идиоматичным. Из многочисленных докладов, а может, и по собственному опыту, вы уже знаете, что на Kotlin-код писать гораздо приятнее, так почему бы и библиотеки сразу не писать на нём? Действительно, интероп с Java широко разрекламирован. Однако, в то время как Java-код дёргать из Kotlin можно без особых проблем, работа с православным Kotlin-кодом из Java имеет свои нюансы. Расскажем, что же припасли создатели Kotlin для таких случаев.

Доклад будет полезен не только писателям библиотек, но и тем, у кого мысль о миграции большого код-бейза на Kotlin вызывает фантомные боли.

More Decks by St. Petersburg Kotlin User Group

Other Decks in Programming

Transcript

  1. compile 'rxbinding-kotlin:x.y.x' compile 'rxbinding-design:x.y.x' compile 'autodispose-android-archcomponents-kotlin:x.y.z' compile 'autodispose-kotlin:x.y.z' compile 'autodispose-android-kotlin:x.y.z'

    compile 'autodispose:x.y.z' compile 'autodispose-android:x.y.z' compile 'autodispose-android-archcomponents:x.y.z' compile 'rxbinding:x.y.x' compile 'rxbinding-appcompat-v7:x.y.x' compile 'rxbinding-design-kotlin:x.y.x' compile 'rxbinding-appcompat-v7-kotlin:x.y.x'
  2. ANALYTICS ABSTRACTION LIBRARY object Analytics { fun send(event: Event) {}

    fun addPlugins(plugs: List<Plugin>) {} fun getPlugins(): List<Plugin> {} }
  3. ANALYTICS ABSTRACTION LIBRARY object Analytics { fun send(event: Event) {}

    fun addPlugins(plugs: List<Plugin>) {} fun getPlugins(): List<Plugin> {} } interface Plugin { fun init() fun send(event: Event) fun close() }
  4. ANALYTICS ABSTRACTION LIBRARY object Analytics { fun send(event: Event) {}

    fun addPlugins(plugs: List<Plugin>) {} fun getPlugins(): List<Plugin> {} } data class Event( val name: String, val context: Map<String, Any> = emptyMap() ) interface Plugin { fun init() fun send(event: Event) fun close() }
  5. USE-SITE VS DECLARATION-SITE VARIANCE // Java List<Dog> dogs = new

    ArrayList <>(); List<? extends Animal> animals = dogs;
  6. USE-SITE VS DECLARATION-SITE VARIANCE // Java List<Dog> dogs = new

    ArrayList <>(); List<? extends Animal> animals = dogs; // Kotlin val dogs: List<Dog> = ArrayList() val animals: List<Animal> = dogs
  7. USE-SITE VS DECLARATION-SITE VARIANCE // Java List<Dog> dogs = new

    ArrayList <>(); List<? extends Animal> animals = dogs; interface List<out E> : Collection<E> // Kotlin val dogs: List<Dog> = ArrayList() val animals: List<Animal> = dogs
  8. USE-SITE VS DECLARATION-SITE VARIANCE // Java List<Dog> dogs = new

    ArrayList <>(); List<? extends Animal> animals = dogs; interface List<out E> : Collection<E> // Kotlin val dogs: List<Dog> = ArrayList() val animals: List<Animal> = dogs
  9. MAY THE ANNOTATIONS BE WITH YOU • @JvmOverloads • @JvmStatic

    • @JvmField • @JvmWildcard @JvmSuppressWildcards • @Throws • @JvmName • @JvmMultifileClass
  10. WORTH NOTING • Inline functions • Reified type params •

    java.lang.Class • Unit • Typealiases
  11. WORTH NOTING • Inline functions • Reified type params •

    java.lang.Class • Unit • Typealiases • Visibility
  12. WORTH NOTING • Inline functions • Reified type params •

    java.lang.Class • Unit • Typealiases • internal visibility (!)
  13. WANT MORE? • Code from the talk https://goo.gl/ZWneG9 • Sinking

    Your Teeth Into Bytecode by Jake Wharton https://goo.gl/JLqFHr • Exploring Kotlin’s hidden costs  by Christophe Beyls https://goo.gl/xxLvWE