Przewaga Javy nad Kotlinem

2

Były już podobne tematy, jednak odnosiły się one do nowości w Kotlinie porównując ją do Javy, lub co jest bardziej przyszłościowe/płatne itp.

Jednak tu chciałabym rozpocząć nieco inną dyskuję...

W czym Java jest lepsza od Kotlina ?
Czy jest coś, czego Kotlin może pozazdrościć Javie i czego nigdy nie osiągnie ? Czy Kotlin ma jakieś ograniczenia w stosunku do Javy ?
Zapraszam do dyskusji.

1

Polecam wpis od allegro
https://allegro.tech/2018/05/From-Java-to-Kotlin-and-Back-Again.html

Wszystko ma swoje plusy i minusy, na korzysc Javy na pewno przemawia ilość tutoriali, rozwiązanych problemów.

2

Kotlin to jest Java++
Dowolny kod w Javie można przerobić na Kave albo Jotlina jakiegoś, więc nie ma za bardzo żadnych "ograniczeń". W drugą stronę trudniej ;]
Java to jest taki trochę niskopoziomowy (w porównaniu do Kotlina, Scali czy Clojure) język referencyjny dla JVM.

Piszemy ostatnie kilka miesięcy w Kotlinie, ale jakoś nie zauważyłem efektu "wow". Klepie się podobnie jak w Javie i raczej dość naturalnie. Trochę więcej syntactic sugars, trochę mniej boilerplate code, ale nie widzę jakiejś drastycznej różnicy w kodzie.

4

Na korzyść Javy przemawia: tony programistów, ktrórzy umieją napisać BookStore w Javie / Springu.

1

Dowolny kod w Javie da się przetłumaczyć na kod w Kotlinie praktycznie 1:1. Trudności są w miejscach gdzie Java przejechała się na własnych ułomnościach i coś trzeba było z tym zrobić:

  • generyki w Kotlinie działają inaczej niż w Javie
  • brak statycznych elementów klasy
    Założeniem Kotlina jest, że każdej klasy Java da się użyć z marszu w Kotlinie i odwrotnie więc kod napisany w Kotlinie da się przetłumaczyć na kod napisany w Javie, ale czasami trzeba jednak coś przepisać inaczej, bo np. Kotlin ma własne kolekcje i strumienie.

Istotną wadą Kotlina może być za to brak tak rozbudowanej listy kolekcji w związku z czym podczas rekrutacji bez sensu jest pytać "czym się różni LinkedList od ArrayList" i pozostaje jedynie pytanie o różnice pomiędzy klasą abstrakcyjną a interfejsem, ale to akurat istotne jest jedynie dla seniorów.

1

Kotlin ma własne kolekcje i strumienie.
Istotną wadą Kotlina może być za to brak tak rozbudowanej listy kolekcji w związku z czym podczas rekrutacji bez sensu jest pytać "czym się różni LinkedList od ArrayList" i pozostaje jedynie pytanie o różnice pomiędzy klasą abstrakcyjną a interfejsem, ale to akurat istotne jest jedynie dla seniorów.

Kotlin rozszerza standardowe kolekcje z Javy. To Scala ma własne niekompatybilne z Javą kolekcje i trzeba używać wrapperów, by móc np przenieść Scalową Listę do metody oczekującej Javowej Listy.

Przykłady kolekcji w Kotlinie:

Możesz sobie spokojnie użyć także innych kolekcji z Javy w Kotlinie, bez wrapperów i bez konwersji. Na przykład:

fun main(args: Array<String>) {
    val kolekcja: MutableList<String> = java.util.LinkedList<String>()
    kolekcja.add("Hello")
    kolekcja.add("World")
    println(kolekcja)
}

https://www.ideone.com/NgVvXY

generyki w Kotlinie działają inaczej niż w Javie

Różnica sprowadza się głównie do use-site variance vs declaration-site variance: https://stackoverflow.com/q/4231305 Declaration-site variance jest między innymi w: C#, Kotlinie, Scali. Nie w Javie.

Niektórzy myślą, że Kotlin rozwiązuje problem wymazywania typów poprzez słówko kluczowe reified pokazane tutaj: https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters
Prawda jest taka, że Kotlin wcale magicznie nie odzyskuje wymazanych typów. Po prostu słówko kluczowe reified wymaga także słówka kluczowego inline, a więc ciało metody jest wklejone w miejsce wywołania na etapie kompilacji i także na etapie kompilacji kompilator statycznie oblicza którą klasę tworzymy. To jest coś zupełnie innego niż w C#, aczkolwiek samo podniecenie w związku z kompilującym się kodem typu new T() (w metodzie generycznej) jest takie samo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1