Kotlin Java Library Design
Quick start
- Read
references/kotlin-java-library.mdbefore changing public Kotlin APIs for Java consumers. - Design Kotlin APIs as if the primary caller is Java: explicit overloads, stable names, and predictable nullability.
- Use JVM interop annotations (
@JvmOverloads,@JvmStatic,@JvmField,@JvmName) to shape the Java surface. - Prefer Java-friendly top-level functions with
@file:JvmName, and use@file:JvmMultifileClasswhen splitting across files. - Use
fun interfacefor Java callbacks; avoid function types that returnUnit. - Document checked exceptions with
@Throwsand return defensive copies for read-only collections. - Follow binary compatibility rules: add overloads or new members instead of changing published signatures.
- Validate examples with
scripts/verify-examples.javawhen changing the reference or public API patterns.
Workflow
- Identify which public APIs must be Java-friendly (constructors, factories, utilities, callbacks, records).
- Shape the Java surface with JVM annotations and explicit overloads.
- Audit public signatures for Java stability (names, nullability, overload sets, and collection exposure).
- Apply backward-compatibility rules before publishing; treat
@PublishedApimembers as public. - Validate with Java call-site examples.
- Run
jbang skills/kotlin-java-library/scripts/verify-examples.java; if it fails, fix the sample or document why it cannot be tested.
Rules of thumb
- Avoid Kotlin-only surface features in public API: default args without overloads, extension-only entry points, and name clashes.
- Explicitly declare public return and property types.
- Use
@JvmOverloadsfor Java-callable optional parameters, and provide explicit overloads when behavior differs. - Use
@JvmStaticfor companion/object members meant to be static in Java. - Use
const valfor compile-time constants and@JvmFieldonly for immutable non-constfields you want exposed as fields. - Use
@JvmNameto resolve signature clashes or to provide a stable Java name. - Use
@JvmRecordonly for new Java-record value carriers targeting JVM 16+; do not retrofit it onto published classes. - Avoid
Nothingin public generic signatures; it becomes raw types in Java.
Output expectations
- Offer Java-call-site examples when proposing API changes.
- Call out binary compatibility risks and safer alternatives.
- Include validation results for non-trivial snippets.
References
- Load
references/kotlin-java-library.mdfor interop details, examples, and testing prompts.