JavaRush /Blog Java /Random-PL /Czy jest jakaś różnica między Kotlinem a Javą?
Paul Soia
Poziom 26
Kiyv

Czy jest jakaś różnica między Kotlinem a Javą?

Opublikowano w grupie Random-PL
Cześć wszystkim. Chcę opowiedzieć Ci kilka podstawowych rzeczy o języku Kotlin, które przydadzą się początkującym. Tak się składa, że ​​teraz ciężko będzie wejść w rozwój Androida znając tylko jeden język – większość nowych projektów zaczyna być pisana w Kotlinie, większość gotowych projektów jest pisana w Javie. Czy jest jakaś różnica między Kotlinem a Javą?  - 1W tej chwili mam w pracy 4 projekty: dwa w Kotlinie i dwa w Javie (jeden duży główny i trzy małe do użytku wewnętrznego). Kiedy firma zdecydowała się na pisanie nowych projektów w Kotlinie, decyzja ta wydała mi się dziwna. Po co mieszać różne języki? Niech ktoś inny napisze w Kotlinie, po co nam to? Nie było jednak wyjścia, więc postanowiłam wypróbować nowy język i zaczęłam się go uczyć. Pierwszy kod został oczywiście napisany w całości w stylu Java, co jeszcze bardziej pogłębiło nieporozumienie: po co mi nowy język? Ale w miarę używania znajdowałem coraz więcej zalet i teraz (piszę w Kotlinie od prawie 2 lat) mogę powiedzieć, że Kotlin jest wygodniejszy w tworzeniu Androida. Chcę pokazać pewne niuanse, które nie będą oczywiste dla kogoś, kto zdecydował się rozpocząć naukę Kotlina po Javie. Przypomnę też, że Android korzysta z Java 8, a aktualna wersja to 14. A więc na początek - Zmienne : Java:
Int a = 1;
String s = "test";
Kotlina:
val a = 1
var b = 2
val c: Int
val d = "test"
W Kotlinie istnieją dwa typy zmiennych: val (tylko do odczytu) i var (do odczytu i zapisu). Zaleca się używanie val, gdy tylko jest to możliwe. Nie jest konieczne deklarowanie typu zmiennej, jeśli zmienna została już zainicjowana. Po drugie – instrukcje if/else, switch : Jak często używasz tego łańcucha instrukcji w Javie:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
Lub tak:
switch(выражениеДляВыбора) {
        case (oznaczający 1):
                Код1;
                break;
        case (oznaczający 2):
                Код2;
                break;
...
        case (oznaczający N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
W Kotlinie do takich wyrażeń używany jest operator When (chociaż można również użyć if/else):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
Tutaj nie tylko przeszliśmy przez łańcuch warunków, ale także od razu przypisaliśmy całe wyrażenie do zmiennej wynikowej, co zaoszczędziło nam sporo linijek kodu. Ale mimo to, jeśli masz tylko dwie opcje w oddziale, polecam użycie zwykłego if..else. Konstrukcja kiedy będzie krótsza tylko w trzech wariantach. Przejdźmy dalej - Konstruktorzy . Tutaj jest bajka. Wystarczy porównać kod w Javie i Kotlinie. Jawa:
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Kotlina:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Może się wydawać, że w kodzie Kotlina coś zostało niedokończone. Ale nie, to dwa identyczne kody w różnych językach. Rozwiążmy to trochę. W Kotlinie konstruktor można zapisać bezpośrednio w treści nazwy klasy (ale jeśli chcesz, możesz to zrobić w staromodny sposób, jak w Javie). Napisaliśmy więc trzy zmienne, w Javie stworzyliśmy konstruktor, gettery i jeden setter dla zmiennej age. Jak pamiętamy, w Kotlinie zmienna val jest tylko do odczytu i dlatego moduł ustawiający te zmienne nie jest dostępny (Kotlin implementuje moduły pobierające pod maską). Zmienna var pozwala na użycie metody ustawiającej. W efekcie napisaliśmy niemal w jednym wierszu to samo, co w Javie zajmowało kilkanaście wierszy. Tutaj polecam przeczytać więcej o klasach danych w Kotlinie. Ale to nie wszystko, w czym konstruktorzy Kotlina są dobrzy. Ale co, jeśli potrzebujesz dwóch konstruktorów? A co jeśli będzie ich trzech? W Javie wyglądałoby to tak:
public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

public Person(String firstName) {
        this.firstName = firstName;
    }
Nic skomplikowanego, po prostu tylu projektantów, ilu potrzebowało, to właśnie zrobili. W Kotlinie możesz obejść się za pomocą tylko jednego konstruktora. Jak? To proste - wartości domyślne.
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
W konstruktorze przypisaliśmy wartości domyślne i teraz ich wywołanie będzie wyglądało następująco:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
Może pojawić się pytanie: co to jest:
private val lastName: String? = null
Jakie są te inne znaki zapytania? Tak, jeśli wartość może mieć wartość null, to jest ustawiana.Jest ?też taka opcja - !!(jeśli zmienna nie może przyjąć wartości null). Przeczytaj o tym sam, wszystko jest proste. I przechodzimy do następnego punktu. Rozszerzenia . To bardzo fajne narzędzie w Kotlinie, które nie jest dostępne w Javie. Czasami w projekcie używamy metod szablonowych, które powtarzają się w wielu klasach. Na przykład tak:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
W Kotlinie możemy rozszerzyć klasę:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
A następnie używaj go w ten sposób w całym projekcie:
context?.toast("hello world")
Zrobiliśmy rozszerzenie dla klasy Context. A teraz wszędzie tam, gdzie dostępny jest kontekst, dostępna będzie nowa metoda tostowania. Można to zrobić dla dowolnej klasy: String, Fragment, twoich klas niestandardowych, nie ma żadnych ograniczeń. Ostatnim punktem, któremu się przyjrzymy, jest Praca z ciągami znaków . Tutaj wszystko jest proste. W Javie jest to napisane tak:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
W Kotlinie jest łatwiej:
val s = "friends"
val a = 5
println("I have $a $s!")
Oto niuanse, na które natknąłem się na początku nauki Kotlina, mam nadzieję, że to ci pomoże.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION