Kotlin vs. Java: - Mye unødvendig boilerplate

Vi stilte seniorkonsulent Henrik Steen i Miles alle de dumme spørsmålene om Kotlin, og fikk alt annet enn dumme svar tilbake.

Henrik Steen er seniorkonsulent i Miles AS. 📸: Privat
Henrik Steen er seniorkonsulent i Miles AS. 📸: Privat Vis mer

Selv om Java fortsatt er et temmelig mye brukt programmeringsspråk, velger stadig flere å droppe Java til fordel for Kotlin.

Det at Google i 2019 annonserte Kotlin som det foretrukne språket for å lage Android-apper har nok også bidratt til at språket har blitt temmelig populært de siste årene.

Men hva er egentlig Kotlin, og hvordan skiller det seg fra Java – og for den saks skyld andre programmeringsspråk?

Vi spurte Henrik Steen, som jobber som seniorkonsulent i Miles.

– Henrik, forklar kort hva Kotlin er for en fersk utvikler

– Kotlin er et allsidig sterkt typet programmeringsspråk som har blitt et populært alternativ til Java. I likhet med Java kan det kompileres til å kjøre på JVM, men også kompileres til en native-applikasjon, JavaScript og i seneste versjon WebAssembly.

– Kotlin integrerer med Java slik at dette kan brukes om hverandre i samme applikasjon. For eksempel kan man bruke et Java-bibliotek fra Kotlin-kode og motsatt, eller ha en kombinasjon av Java-kildekode og Kotlin-kildekode i samme applikasjon.

– Kotlin er, som Java, i utgangspunktet et objektorientert språk, men det støtter også "procedural programming" uten klasser og byr i stor grad også på en funksjonell programmeringsstil.

– Hvem står bak Kotlin?

– Det er selskapet JetBrains, antakelig best kjent for IDE-en IntelliJ IDEA. Kotlin i seg selv ble påbegynt i 2010 og lansert som versjon 1.0 i 2016. Sånn sett er Kotlin et forholdsvis ungt språk. Kotlin bruker den frie lisensen Apache License 2.

– Det at JetBrains står bak både Kotlin og IDE-en IntellIJ betyr at støtten for Kotlin er svært god i IntelliJ. Det er det verktøyet jeg selv bruker når jeg jobber med Kotlin.

– Hva er de største forskjellene mellom Kotlin og Java?

– Buzzwordet man kanskje hører mest, er at Kotlin skiller på typer som kan være null og ikke, som i stor grad eliminerer NullPointerException. Java derimot skiller ikke på dette i språket i seg selv, slik at man ikke alltid vet hvorvidt man må håndtere at noe er null, eller om null er en lovlig verdi å bruke.

– Den største forskjellen vil jeg si ligger i mengden kode man må skrive for å løse et problem i de to språkene. Kotlin er et mye mer konsist språk. Det byr på "type inference", det meste av statements kan brukes direkte som expressions, og språket har et veldig rikt standardbibliotek som forenkler mange operasjoner. Med Java ender man opp med veldig mye boilerplate som føles unødvendig og stjeler fokus.

– Kotlin har noe som kalles "extension functions" som gjør at man litt forenklet kan utvide objekter med flere metoder. Dette brukes flittig i standardbiblioteket. Der man i Java gjerne må konvertere til et Stream-objekt for å gjøre map over en liste, for så å konvertere tilbake til en liste, bruker man bare map-metoden direkte på en liste i Kotlin.

«Det er mye mer naturlig å skrive kode med en funksjonell stil i Kotlin.»

– Selve syntaksen er litt annerledes, ved for eksempel at typer angis etter et kolon. Altså på samme måte som i TypeScript og Rust, og ikke før variabelnavn/metodenavn som i Java. I Kotlin kan man også definere en vilkårlig funksjon direkte med en signatur og uten bruk av for eksempel Callable, Supplier og lignende.

– Det er mye mer naturlig å skrive kode med en funksjonell stil i Kotlin.

– Kotlin foretrekker en immutable stil i større grad. Der man i Java må angi final for å gjøre ting immutable, fungerer det gjerne motsatt i Kotlin.

– Det er mange andre ting som også er verdt å nevne: Coroutines – herunder structured concurrency, flow og channels, data classes, operator overloading, smart casts, fravær av checked exceptions, named arguments, optional/default parameters.

– Det må også nevnes at Java de senere årene har fått noe liknende funksjonalitet som Kotlin var alene om en god stund. Dette gjelder for eksempel records, "var"-keyword, multiline-strings, switch expressions, sealed classes, virtual threads. Men dette er små ting i det store bildet av forskjeller.

– Hva kan du bruke Kotlin til? Er det bare for å lage Android-apper?

– Kotlin ble det offsielle foretrekkede språket for utvikling av Android-apper i 2019, men det er en misoppfatning at Kotlin bare er for Android-utvikling.

– I The State of Developer Ecosystem 2022 av JetBrains så svarte 66 % at de brukte Kotlin til Android-utvikling, samt 49 % til serverside-utvikling. En betydelig mindre andel trakk frem desktop, native og web, for å nevne noe.

– Blant annet Spring Framework og Spring Boot tilbyr "first-class" støtte for Kotlin.

– Ettersom Kotlin kan kompileres til JavaScript – med TypeScript-typer – så kan man også skrive logikk i Kotlin og bruke det som et bibliotek fra JavaScript, eller til og med lage en full web-applikasjon i Kotlin med for eksempel React.

– Er det enkelt å gjøre om en Java-kodebase til Kotlin?

– En stor fordel er at man kan gjøre det gradvis, ved å la Java-kode og Kotlin-kode leve side-om-side. IntelliJ støtter å konvertere Java-kode til Kotlin, men det blir ikke helt perfekt og trenger ofte litt justeringer. Min erfaring er at man gjerne skriver Kotlin-kode med en litt annen stil, men det er et absolutt godt utgangspunkt.

– En utfordring å kalle på tvers av språkene er at typene ikke er like gode, for eksempel rundt null-håndtering. I tillegg kan det være litt knotete å kalle inn til Kotlin-kode fra Java-kode, ettersom man da må følge reglene til Java i større grad og bruke annoteringer i Kotlin for at kompilatoren skal lage riktige bindinger så ting kan benyttes fra Java.

– Dette er også noe av grunnen til at man ofte foretrekker å bruke biblioteker som i større grad er skrevet for Kotlin, fordi de også ofte byr på en bedre utvikleropplevelse og støtter funksjonalitet Kotlin har som Java mangler.

– Hva slags type prosjekter bruker dere Kotlin til der du jobber?

– Hovedsaklig har jeg brukt Kotlin der jeg ellers ville brukt Java, som for meg betyr server-side. Det vil si API-er eller andre små og store backendapplikasjoner.

– Det første jeg brukte Kotlin til var for å skrive tester for en i stor grad databasedrevet applikasjon i 2017/2018, hvor Kotlin lot meg bygge en slags DSL på toppen for å forenkle testingen. Siden har det gått i alt fra små, enkle API-er, og applikasjoner bygget med event sourcing og dataprosesseringspipeliner.

– For meg har Kotlin i stor grad erstattet Java til disse formålene og det er nesten vanskelig å se for meg å gå tilbake til ren Java-koding.

«Det er nesten vanskelig å se for meg å gå tilbake til ren Java-koding.»

– Hva med Kotlin og multiplattform?

Kotlin Multiplatform har vært i beta helt siden 2017, og er ett av de store satsingsområdene til Kotlin. Siden 2020 har også Kotlin Multiplatform Mobile vært i beta. Kjernen av dette handler i stor grad at man skal kunne skrive kode én gang, men bruke det til forskjellige applikasjoner og mål.

– Multiplatform i seg selv fungerer ved at Kotlin frigjør seg fra JDK og JVM-en, og tilbyr egne abstraksjoner som det igjen er platform-spesifikke implementasjoner for. Det betyr også at biblioteker man bruker ikke kan avhenge av klasser fra JDK-en, men enten må bygge oppå Kotlin sin abstraksjon eller tilby plattform-spesifikke bindinger.

Kotlin Multiplatform Mobile er en SDK og plugin som gjør det enklere å lage biblioteker og bindinger som kan brukes for et native Android-prosjekt (JVM) eller native iOS-prosjekt (Objective-C/Swift mot Kotlin/Native). I praksis får man en native Android- og native iOS-app inni kodebasen, som har tilgang på den delte koden.

– Dette er sånn sett litt annerledes enn hvordan det gjøres i React Native og Flutter, hvor man i stor grad også skriver felles kode for UI-et og ikke bare forretningskoden bak. Her kan det godt hende at ting endrer seg mye med tiden siden dette er forholdsvis umodent, og jeg har ikke selv testet ut dette.

– Hvis jeg kan Java, hvor enkelt er det å komme i gang med Kotlin?

– Å komme i gang med Kotlin er veldig enkelt, spesielt om man bruker IntelliJ allerede. Da mye vil føles likt i hvordan man jobber.

– Det er fort å plukke opp forskjellen i syntaks, og så fort man har lært grunnleggende syntaks kan man ofte også lene seg på IntelliJ som foreslår metoder fra standardbiblioteket. Det å bruke IntelliJ til å konvertere Java-kode kan også være nyttig iblant.

– Det er god dokumentasjon for hvordan man setter opp Kotlin-støtte i samme kodebase som Java, som kan være en glimrende måte å begynne å utforske på og gradvis måte å migrere over.

– Har du tips til gode læringsressurser?

– Da jeg lærte Kotlin for en del år siden tok jeg et nettkurs som rettet seg mot Java-utviklere: Kotlin for Java Developers. Dette var veldig nyttig da jeg både fikk en god gjennomgang av språket i seg selv, men også sett opp mot Java og hvordan det avviker. Det er ikke nødvendig, men det hjelper veldig med å akselerere forståelsen og kunne gå løs på litt mer komplekse ting.

– Den offisielle siden kotlinlang.org er også veldig rik på dokumentasjon og anbefales å titte gjennom. Blant annet har de en "Kotlin by example"-side som går gjennom de ulike konseptene og forklarer de samtidig.

– Jeg har ikke angret på å gå over til Kotlin fra Java, og de fleste jeg har jobbet med deler det samme synet. Å kode i Kotlin er gøy og produktivt!