JavaRush /Java блог /Random UA /Чи є відмінність Kotlin від Java?
Paul Soia
26 рівень
Kiyv

Чи є відмінність Kotlin від Java?

Стаття з групи Random UA
Всім привіт. Хочу розповісти трохи базових речей про мову Kotlin, що буде корисним новачкам. Так уже склалося, що зараз потрапити в android-розробку тільки з однією мовою буде складно — більшість нових проектів починають писати на Kotlin, більшість готових проектів написані Java. Чи є відмінність Kotlin від Java?  - 1На даний момент у мене на роботі 4 проекти: два на Kotlin і два на Java (один великий основний та три маленькі, для внутрішнього користування). Коли компанією було ухвалено рішення писати нові проекти на Kotlin, для мене це рішення здавалося дивним. Навіщо заважати різні мови? Нехай собі хтось інший пише на Kotlin, чи нам воно навіщо? Але виходу не було, тому вирішив випробувати нову мову і почав її вивчати. Перший код, звичайно, був повністю написаний в стилі Java, що ще більше додавало нерозуміння: навіщо мені нова мова? Але в міру його використання я все більше знаходив переваг і зараз (вже майже 2 роки пишу на Kotlin) можу сказати, що в андроїд-розробці Kotlin зручніше. Хочу показати деякі нюанси, які будуть неочевидними для того, хто вирішив почати вивчати Kotlin після Java. Також нагадаю, що в андроїді використовується Java 8,Змінні : Java:
Int a = 1;
String s = "test";
Kotlin:
val a = 1
var b = 2
val c: Int
val d = "test"
У Kotlin змінні двох типів: val (тільки для читання) та var (для читання та запису). Рекомендується використовувати val скрізь, де це можливо. Оголошувати тип змінної не обов'язково, якщо змінна вже ініціалізована. Друге - вирази if/else, switch : Як часто ви використовуєте в Java такий ланцюжок операторів:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
Або так:
switch(выражениеДляВыбора) {
        case (значення 1):
                Код1;
                break;
        case (значення 2):
                Код2;
                break;
...
        case (значення N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
У Kotlin використовується для таких виразів оператор when (хоча if/else також можна використовувати):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
Тут ми не просто пройшлися ланцюжком умов, а ще й весь вираз відразу привласнабо в змінну result, що скоротило нам чимало рядків коду. Але все ж таки якщо у вас тільки два варіанти у розгалуженні, рекомендую використовувати звичайний if..else. Конструкція коли буде коротше тільки від трьох варіантів. Ідемо далі - Конструктори . Тут загалом казка. Просто порівняйте код у Java та Kotlin. Java:
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;
    }
}
Kotlin:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Може здатися, що код на котлині щось не дописали. Але ні, це два ідентичні коди різними мовами. Давайте трохи розберемося. У Kotlin конструктор можна прописувати прямо в тілі назви класу (але якщо хочеться, то можна і по-старому, як у Java). Отже, ми прописали три змінні, Java створабо конструктор, гетери і один сеттер для змінної age. У Kotlin, як ми пам'ятаємо, змінна val тільки для читання, а тому сеттер для цих змінних недоступний (гетери-сеттери котлин реалізує під капотом сам). Змінна var дозволяє використовувати сеттер. У результаті майже одним рядком ми написали те саме, що на Java зайняло більше десятка рядків. Тут рекомендую ще почитати про data class у Kotlin. Але це ще не все, в чому хороші конструктори в Kotlin. А що, якщо вам потрібні два конструктори? А якщо три? У Java це буде виглядати так:
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;
    }
Нічого складного, скільки треба конструкторів, стільки й зробабо. У Kotlin можна обійтись одним конструктором. Як? Все просто значення за замовчуванням.
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
Ми в конструкторі надали значення за замовчуванням і тепер виклик їх виглядатиме так:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
Тут може виникнути питання: що це таке?
private val lastName: String? = null
Що ще за питання? Так, якщо значення може бути null, то ставиться ?. Також є варіант ось такий !!(якщо змінна не може приймати null). Про це вже самі шануйте, там все просто. А ми йдемо до наступного пункту. Extensions . Це дуже крутий інструмент у Kotlin, якого немає в Java. Іноді ми використовуємо шаблонні методи, які повторюються в багатьох класах. Наприклад, так:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
У Kotlin ми можемо зробити розширення для класу:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
І далі по всьому проекту використовувати це так:
context?.toast("hello world")
Ми зробабо розширення для класу Context. І тепер скрізь, де доступний context, буде доступний його новий метод toast. Це можна зробити для будь-якого класу: String, Fragment, ваші кастомні класи, обмежень немає. І останній пункт, який розберемо - Робота з рядками . Тут все просто. У Java це пишеться так:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
У Kotlin простіше:
val s = "friends"
val a = 5
println("I have $a $s!")
Це ті нюанси, на яких я спотикався на початку вивчення Kotlin, сподіваюся, що вам це допоможе.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ