Java vs Kotlin

Java vs Kotlin

Introduction of Kotlin for Java developers with side by side comparison

A8b79d304b5184e5a5b0a109590f6683?s=128

Danny Preussler

August 22, 2019
Tweet

Transcript

  1. 2.

    about:me •Java developer since 2003 •Kotlin developer since 2016 •Google

    Developer Expert for Android and Kotlin •Introduced Kotlin at Groupon and Viacom
  2. 3.
  3. 4.
  4. 5.

    Kotlin adoption •Languages developers want to learn in 2019 •

    https://research.hackerrank.com/ developer-skills/2019
  5. 6.

    Kotlin adoption Okt 18, GitHub: 'Kotlin for Android now fastest-growing

    programming language' https://www.zdnet.com/article/microsofts-github-kotlin-for-android-no w-fastest-growing-programming-language/
  6. 7.
  7. 8.

    Kotlin adoption • JVM Ecosystem Report 2018 (10k questionaires): What

    is the principal JVM language you use for your main applications? • Kotlin edges past Groovy and Scala in language usage on 2.42% https://snyk.io/blog/jvm-ecosystem-report-2018/
  8. 9.

    Kotlin adoption •1.5M+ developers edited Kotlin code in 2018 •100M+

    lines of Kotlin code •96,000+ Kotlin GitHub repositories •Android — 1 in 4 apps (from top 1000) uses Kotlin •Server — х2 from 2017 https://www.jetbrains.com/annualreport/2018/community/
  9. 10.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    The year: 2010 Java6 has been around the 4th year
  10. 11.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    The year: 2010 Kotlin Development started internally
  11. 12.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    July 2010 Swift Development started
  12. 14.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    July 2011 JetBrains unveiled Project Kotlin
  13. 15.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    February 2012 JetBrains open sourced Kotlin
  14. 17.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    June 2014 WWDC application became the first publicly released Swift app
  15. 20.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    Google I/O 2017 Official Kotlin support for Android
  16. 23.

    2010 2011 2012 2013 2014 2015 2016 2017 2018 2019

    Google I/O 2019 Kotlin becomes preferred language for Android
  17. 25.

    Goals of Kotlin Modern language Faster compilation than Scala Smaller

    footprint than Scala Designed to work perfectly with Java (designed for 6+8)
  18. 30.
  19. 40.

    Type inference in Java 10 Difference to Kotlin: • var

    is not a keyword in Java 10 • it‘s a reserved type name
  20. 42.

    Lets talk null I call it my billion-dollar mistake. It

    was the invention of the null reference in 1965   Tony Hoare ( inventor of the null reference)
  21. 51.

    Lets talk null •Equivalent in Java: @NonNull but runtime crash

    vs compiler only •Nullability is Part of Typesystem
  22. 52.
  23. 53.

    Lets talk null fun some(thing: String) {…} public final void

    some( @NotNull String thing) { checkParameterIsNotNull(thing, "thing"); }
  24. 62.
  25. 69.
  26. 72.

    default parameters vs overloading class Api { Api(String baseURl) {

    this(baseURl, CacheStrategy.NO_CACHE) } Api(String baseURl, CacheStrategy cache) { } }
  27. 75.

    default parameters vs overloading class Api( private val baseUrl: String,

    val cache: CacheStrategy = CacheStrategy.NO_CACHE )
  28. 77.

    Sealed classes sealed class LoadingState { class Loading : LoadingState()

    class Loaded : LoadingState() class Empty : LoadingState() }
  29. 78.

    Lazy initialization public class LazyField { private String value; public

    String getValue() { if (value == null) { value = computeValue(); } return value } private String computeValue() { .... } }
  30. 80.

    Lazy initialization class LazyField { val: String by lazy {

    computeValue() } private fun computeValue()= … }
  31. 90.

    Primitives in Kotlin: Costs? •The numeric type usages in Kotlin

    are compiled into JVM primitives where possible. •Compiler decides
  32. 91.

    Primitives in Kotlin: Costs? •The numeric type usages in Kotlin

    are compiled into JVM primitives where possible. •Compiler decides •Works because of missing widening int a = 1; double b = a; val a:Int = 1 val b:Double = a
  33. 92.

    Primitives in Kotlin •Nullable type cannot be primitive •Primitives cannot

    be used as a generic type argument. •List<Int> is equivalent of Java List<Integer> •Therefore IntArray as type!
  34. 94.

    Operator overloading operator fun plusAssign(callback: Callback) { callbacks.add(callback) } operator

    fun minusAssign(callback: Callback) { callbacks.remove(callback) } adapterCallbacks += {…}
  35. 95.

    Expression Translated to a++ a.inc() + see below a-- a.dec()

    + see below Expression Translated to +a a.unaryPlus() -a a.unaryMinus() !a a.not() Expression Translated to a + b a.plus(b) a - b a.minus(b) a * b a.times(b) a / b a.div(b) a % b a.rem(b), a.mod(b) (deprecated) a..b a.rangeTo(b)
  36. 96.

    Operator overloading Expression Translated to a > b a.compareTo(b) >

    0 a < b a.compareTo(b) < 0 a >= b a.compareTo(b) >= 0 a <= b a.compareTo(b) <= 0 Expression Translated to a == b a?.equals(b) ?: (b === null) a != b !(a?.equals(b) ?: (b === null))
  37. 97.

    Operator overloading Expression Translated to a in b b.contains(a) a

    !in b !b.contains(a) Expression Translated to a[i] a.get(i) a[i, j] a.get(i, j) a[i_1, ..., i_n] a.get(i_1, ..., i_n) a[i] = b a.set(i, b) a[i, j] = b a.set(i, j, b) a[i_1, ..., i_n] = b a.set(i_1, ..., i_n, b)
  38. 98.

    Operator overloading Expression Translated to a() a.invoke() a(i) a.invoke(i) a(i,

    j) a.invoke(i, j) a(i_1, ..., i_n) a.invoke(i_1, ..., i_n) Expression Translated to a += b a.plusAssign(b) a -= b a.minusAssign(b) a *= b a.timesAssign(b) a /= b a.divAssign(b) a %= b a.remAssign(b), a.modAssign(b) (deprecated)
  39. 99.

    Operator overloading •Range expression for (i in 1..4) print(i) operator

    fun rangeTo(other: Int) = IntRange(this, other)
  40. 104.

    Getter / Setter val live get() = category.live public final

    boolean getLive() { return category.getLive(); }
  41. 106.

    Delegation •inheritance Effective Java: Item 16: Favor composition over inheritance

    class FirebaseFeatureFlags ( private val defaults: DefaultFeatureFlags ) : FeatureFlags by defaults {
  42. 107.
  43. 108.
  44. 113.
  45. 118.

    Infix val game = homeTeam.vs(guestTeam) val game = homeTeam vs

    guestTeam infix fun Team.vs(team: Team) = Pairing(this, team)
  46. 121.
  47. 123.
  48. 125.

    inline •Powerful with reified: Allows generics with type check: T::class

    inline fun <reified T : Context> Activity.start() { startActivity(Intent(this, T::class.java)) }
  49. 126.

    inline inline fun <reified T : Context> Activity.start() { startActivity(Intent(this,

    T::class.java)) } start<MainActivity>() $receiver$iv.startActivity( new Intent( (Context)$receiver$iv, MainActivity.class) );
  50. 128.

    inline •Inline classes •Experimental •Inline classes are final •Can lead

    to weird boxing issues •Not compatible with @Parcelize inline class Time(private val timeMs: Long)
  51. 129.
  52. 130.

    • Lightweight threads • Allows asynchronous code to be written

    sequentially suspend fun concurrentSum(): Int = coroutineScope { val one = async { doSomethingUsefulOne() } val two = async { doSomethingUsefulTwo() } one.await() + two.await() }
  53. 137.
  54. 138.

    Other changes •Classes/methods public by default •Classes/methods final by default

    (vs open) •Inner class: static by default (vs inner) •Stricter usage of protected
  55. 139.

    Other changes •Classes/methods public by default •Classes/methods final by default

    (vs open) •Inner class: static by default (vs inner) •Stricter usage of protected •New visibility: internal
  56. 140.

    Other changes •Classes/methods public by default •Classes/methods final by default

    (vs open) •Inner class: static by default (vs inner) •Stricter usage of protected •New visibility: internal •One file can have multiple public classes
  57. 141.

    Other changes •Classes/methods public by default •Classes/methods final by default

    (vs open) •Inner class: static by default (vs inner) •Stricter usage of protected •New visibility: internal •One file can have multiple public classes •„global“ functions & variables are allowed
  58. 142.

    Other changes •Classes/methods public by default •Classes/methods final by default

    (vs open) •Inner class: static by default (vs inner) •Stricter usage of protected •New visibility: internal •One file can have multiple public classes •„global“ functions & variables are allowed •No checked Exceptions
  59. 148.

    Java Interop public final class FileKt { public static final

    void foobar() {..} } //File.kt fun foobar(){..}
  60. 151.

    Java Interop @Metadata( mv = {1, 1, 13}, bv =

    {1, 0, 3}, k = 1, d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\ u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002 \b\u0003\u0018\u00002\u00020\u0001:\u0001\u0006B\ u0005¢ \u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00 020\u0004H\u0007J\u0006\u0010\u0005\u001a\u00020\ u0004¨\u0006\u0007"}, d2 = {"Lde/jodamob/android/kotlin/T_TestingTest;", "", "()V", "test", "", "throwSomething", "Something", "app"} )
  61. 155.

    Runtime • Execution time: difference [..] can vary from 6.7%

    in favor of Java [..], to 1.2% in favor of Kotlin [..] • Memory consumption: appeared the lowest in the Java implementation in four out of six benchmarks. • CPU load: no significant distinction in load management https://medium.com/@bards95/comparative-evaluation-of-selected-constru cts-in-java-and-kotlin-part-1-dynamic-metrics-2592820ce80
  62. 156.

    Runtime • Execution time: difference [..] can vary from 6.7%

    in favor of Java [..], to 1.2% in favor of Kotlin [..] • Memory consumption: appeared the lowest in the Java implementation in four out of six benchmarks. • CPU load: no significant distinction in load management https://medium.com/@bards95/comparative-evaluation-of-selected-constru cts-in-java-and-kotlin-part-1-dynamic-metrics-2592820ce80
  63. 157.

    Runtime • Execution time: difference [..] can vary from 6.7%

    in favor of Java [..], to 1.2% in favor of Kotlin [..] • Memory consumption: appeared the lowest in the Java implementation in four out of six benchmarks. • CPU load: no significant distinction in load management https://medium.com/@bards95/comparative-evaluation-of-selected-constru cts-in-java-and-kotlin-part-1-dynamic-metrics-2592820ce80
  64. 158.
  65. 160.

    Less Code Kotlin .. helps to increase a cut in

    the lines of code by approximately 40 % (JetBrains) … tests show … the number of code lines reduces by 30… https://belitsoft.com/apps-development-services/java-vs-kotlin
  66. 166.

    Kotlin ‘Kotlin isn't revolutionary (with the possible exception of its

    null-handling) but feels like a very careful amalgamation of some of the best features of other languages. Rob Fletcher, Netflix https://belitsoft.com/apps-development-services/java-vs-kotlin