( vilmos.nagy | 2021. 06. 22., k – 10:52 )

Én két helyen ismerem előnyét:

  • Android sokáig le volt maradva valahol a Java 6-7 (2006?) lehetőségei szinten
  • és Javas frontend frameworkökben kényelmesebb

Az elsőnél, amennyire követtem, az Android anno az Apache Harmony projekttel kezdett, ami egy Sun/Oracle független GPL Java implementáció volt, s mikor a Google ebbe beleszállt, ez valahol a Java 6 környékén járt. Utána még 1-2 Java 7 nyelvi feature (meg java API) belekerült (pl.: `List<Integer> intList = new ArrayList<Integer>()` kellett a hatosban, a hetestől elég a `List<Integer> intList = new ArrayList<>()`), de a Java 8 (stream api, lambdák, proper időkezelés, és későbbi, 2011 utáni fejlesztések) kb. mind elérhetetlenek voltak Androidon nagyon sokáig. Ha jól értettem anno, akkor az Oracle v. Google per miatt nem merte (akarta) a Google implementálni a frissebb Java featureöket.

Voltak rá különböző megoldások (retrolambda, ami Java 6 bájtkódra fordította a lamdákat, threetenbp ami a java.time csomagot backportolta, stb), de nyögvenyelős volt. Ez egy idő után megoldódott, amikor az OracleGoogle pernek vége lett, és a Google vállalta, hogy átáll OpenJDK-ra Androidon -> de ha jól tudom, ez valami Android update-ként ment ki a készülékekre, Androidon meg ez még mindig nyögvenyelős, szóval ki tudja, mikortól érhető el minden Android készüléken a friss Java API.

Cserébe jött a Kotlin, ami Java 6-os bájtkódra fordult, szóval gond nélkül ment minden Androidon, voltak benne minden XXI. százai nyelvhez illő dolgok, szóval Android körben hamar népszerű lett.

A másodikra (frontend) pl a Vaadinos példa, aki még használ ilyet:

VerticalLayout layout = new VerticalLayout();
Button button = new Button("Click me");
button.addClickListener(() -> Notification.show("Clicked"));
button.setWidth("100%");
layout.add(button);

helyett lehet ilyet írni

var layout = verticalLayout {
    button {
        label = "Click me"
        width = "100%"
        addClickListener { Notification.show("Clicked") }
    }
}

tldr: Könnyen össze lehet rakni Kotlinban type safe DSL leírókat, amikből ilyeneket könnyű építeni. Bár én nem kotlinoztam Androidon (s androidot is csak hobbiból láttam), de tippre ott is egyszerűbb type safe DSL layoutot leírni, mint XML-ben.

A Scala is tudott elméletileg egy csomó ilyesmi dolgot (Java 6os bájtkód szinten lambdákat, pl), de egyrészt ők hozták a saját toolingjukat (sbt), másrészt a Java interop ott szopás, amennyire emlékszem. A Kotlinnak az a nagy előnye, hogy egy meglévő, nagy projektbe is könnyen be tudod dobni, ha csak 1-1 új felületet írnál meg benne, vagy új kódot kell Androidon ebben fejleszteni. Az IDEA, de a Kotlin compiler is talán a mai napig félig Java, félig Kotlin, mert olyan seamless az interop, hogy nem éri meg nekik kipucolni a Java kódot belőle.

Cserébe ha egyszer bekerül egy projektbe, akkor kipucolni sokkal nehezebb -> amíg Java->Kotlin konverzió van automatán az Ideaban, addig fordítva már nem ad a JetBrains rá OOB megoldást. Plusz Kotlinban tényleg lehet mágiákat építeni, és junior jávásokat sokkal nehezebb egy-egy kotlinos dologra ráállítani, mintha mindenki maradt volna Javanál.