Poko
is a Kotlin compiler plugin that generates equals
,
hashCode
, and toString
functions for annotated classes based on their properties. Inspired by
Jake Wharton’s blog post on maintaining compatibility in public
APIs
, it partially mimics the behavior of
Kotlin data classes while leaving out the copy
and componentN
functions, which are difficult to
maintain without breaking API compatibility. Our Paraphrase
and Redwood
runtimes use Poko.
The equals
, hashCode
, and toString
functions are familiar to all JVM developers. But Kotlin
generates the exact same set of functions for data classes on all of its multiplatform targets—not
just the JVM. It stands to reason that Poko should do the same. And thanks to a slew of recent
contributions from Jake, now it does! In addition to the JVM and Android platforms it has supported
since its first release 3 years ago, Poko 0.15.0 now supports native and JS targets as well.
The generated functions behave the same on all platforms, and by default implement the same behavior
that data classes implement: equals
and hashCode
depend on each of the class’s primary
constructor properties, and toString
prints the values of each of these properties.
In addition to standard data class behavior, Poko also recently added support for respecting array
content via an @ArrayContentBased
annotation. Normally, data classes and Poko classes compare
array properties only by reference (unlike collections, which always compare contents), because this
mirrors the JVM’s default treatment of arrays. But in some cases, the performance gains of using
arrays are considerable—particularly on JS, where List
types involve several wrappers around the
native Array
. In runtimes like those of Paraphrase and Redwood, which are only invoked by
generated code, the awkwardness of using array properties is less important than this performance
difference. @ArrayContentBased
makes it possible to opt in to array use in these cases. Like the
rest of Poko, it now works for all target platforms.
Whether using arrays or not, it’s important for library authors to maintain API compatibility across releases. Now, Kotlin multiplatform library authors can easily ship public data models with minimal concern about breaking their APIs.
This post concludes Cash App’s Summer of Kotlin Multiplatform series.