JavaRush /Java blogi /Random-UZ /Kotlin va Java o'rtasida farq bormi?
Paul Soia
Daraja
Kiyv

Kotlin va Java o'rtasida farq bormi?

Guruhda nashr etilgan
Hammaga salom. Men sizga Kotlin tili haqida bir nechta asosiy narsalarni aytib bermoqchiman, bu yangi boshlanuvchilar uchun foydali bo'ladi. Shunday bo'ladiki, endi faqat bitta til bilan Android-ni ishlab chiqishga kirish qiyin bo'ladi - ko'pchilik yangi loyihalar Kotlinda yozila boshlaydi, ko'pchilik tayyor loyihalar Java-da yoziladi. Kotlin va Java o'rtasida farq bormi?  - 1Hozirda menda 4 ta loyiha bor: ikkitasi Kotlinda va ikkitasi Java'da (bir katta asosiy va uchta kichik ichki foydalanish uchun). Kompaniya Kotlinda yangi loyihalar yozishga qaror qilganida, bu qaror menga g'alati tuyuldi. Nega turli tillarni aralashtirib yuborish kerak? Kotlinda boshqa birov yozsin, bu bizga nima uchun kerak? Ammo hech qanday yo'l yo'q edi, shuning uchun men yangi tilni sinab ko'rishga qaror qildim va uni o'rganishni boshladim. Birinchi kod, albatta, butunlay Java uslubida yozilgan bo'lib, bu tushunmovchilikni yanada kuchaytirdi: nega menga yangi til kerak? Lekin men undan foydalanganim sari ko'proq afzalliklarni topdim va endi (men Kotlinda deyarli 2 yildan beri yozyapman) Kotlin Androidni ishlab chiqishda qulayroq deb ayta olaman. Men Java-dan keyin Kotlinni o'rganishni boshlashga qaror qilgan kishi uchun aniq bo'lmaydigan ba'zi nuanslarni ko'rsatmoqchiman. Shuni ham eslatib o'tamanki, Android Java 8 dan foydalanadi, joriy versiyasi 14. Shunday qilib, birinchi navbatda - O'zgaruvchilar : Java:
Int a = 1;
String s = "test";
Kotlin:
val a = 1
var b = 2
val c: Int
val d = "test"
Kotlinda oʻzgaruvchilarning ikki turi mavjud: val (faqat oʻqish uchun) va var (oʻqish-yozish). Imkon qadar val dan foydalanish tavsiya etiladi. Agar o'zgaruvchi allaqachon ishga tushirilgan bo'lsa, o'zgaruvchining turini e'lon qilish shart emas. Ikkinchidan - if/else, iboralarni o'zgartiring : Java'da ushbu iboralar zanjiridan qanchalik tez-tez foydalanasiz:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
Yoki shunday:
switch(выражениеДляВыбора) {
        case (meaning 1):
                Код1;
                break;
        case (meaning 2):
                Код2;
                break;
...
        case (meaning N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
Kotlinda bunday iboralar uchun when operatori ishlatiladi (garchi if/else ham ishlatilishi mumkin):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
Bu erda biz nafaqat shartlar zanjiri orqali o'tdik, balki darhol natija o'zgaruvchisiga butun ifodani tayinladik, bu bizga bir nechta kod qatorlarini saqlab qoldi. Lekin shunga qaramay, filialda faqat ikkita variantingiz bo'lsa, men odatdagi if..else dan foydalanishni tavsiya qilaman. Qurilish faqat uchta variantdan qisqaroq bo'ladi. Keling, davom etaylik - Konstruktorlar . Bu yerda ertak. Faqat Java va Kotlindagi kodni solishtiring. 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 kodida biror narsa tugallanmagandek tuyulishi mumkin. Yo'q, bu turli tillardagi ikkita bir xil kodlar. Keling, buni biroz tushunib olaylik. Kotlinda konstruktor to'g'ridan-to'g'ri sinf nomining tanasiga yozilishi mumkin (lekin agar xohlasangiz, buni Java'dagi kabi eski uslubda qilishingiz mumkin). Shunday qilib, biz uchta o'zgaruvchini yozdik, Java'da biz yosh o'zgaruvchisi uchun konstruktor, getters va bitta setter yaratdik. Kotlinda, biz eslaganimizdek, val o'zgaruvchisi faqat o'qish uchun mo'ljallangan va shuning uchun bu o'zgaruvchilar uchun sozlagich mavjud emas (Kotlin kaput ostida getter-setterlarni qo'llaydi). Var o'zgaruvchisi sozlagichdan foydalanishga imkon beradi. Natijada, biz Java-da o'ndan ortiq satr olgan narsani deyarli bir qatorga yozdik. Bu erda men Kotlindagi ma'lumotlar sinflari haqida ko'proq o'qishni tavsiya qilaman. Lekin bu Kotlin konstruktorlari yaxshi biladigan narsa emas. Agar sizga ikkita konstruktor kerak bo'lsa-chi? Agar uchta bo'lsa-chi? Java-da u quyidagicha ko'rinadi:
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;
    }
Hech qanday murakkab narsa yo'q, kerakli darajada ko'p dizaynerlar, ular shunday qilishdi. Kotlinda siz faqat bitta konstruktor bilan ishlashingiz mumkin. Qanaqasiga? Bu oddiy - standart qiymatlar.
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
Biz konstruktorda standart qiymatlarni tayinladik va endi ularni chaqirish quyidagicha ko'rinadi:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
Savol tug'ilishi mumkin: bu nima:
private val lastName: String? = null
Bu boshqa savol belgilari nima? Ha, agar qiymat null bo'lishi mumkin bo'lsa, u o'rnatiladi ?. Bunga o'xshash variant ham mavjud - !!(agar o'zgaruvchi nullni qabul qila olmasa). Bu haqda o'zingiz o'qing, hammasi oddiy. Va biz keyingi nuqtaga o'tamiz. Kengaytmalar . Bu Java-da mavjud bo'lmagan Kotlin-dagi juda ajoyib vosita. Ba'zan loyihada biz ko'plab sinflarda takrorlanadigan shablon usullaridan foydalanamiz. Masalan, bu kabi:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
Kotlinda biz sinfni kengaytirishimiz mumkin:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Va keyin uni butun loyiha davomida shunday foydalaning:
context?.toast("hello world")
Biz Kontekst sinfi uchun kengaytma yaratdik. Va endi kontekst mavjud bo'lgan joyda, uning yangi tost usuli mavjud bo'ladi. Bu har qanday sinf uchun amalga oshirilishi mumkin: String, Fragment, sizning maxsus sinflaringiz, hech qanday cheklovlar yo'q. Va biz ko'rib chiqadigan oxirgi nuqta - Stringlar bilan ishlash . Bu erda hamma narsa oddiy. Java-da u quyidagicha yozilgan:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
Kotlinda bu osonroq:
val s = "friends"
val a = 5
println("I have $a $s!")
Bular men Kotlinni o'rganishning boshida qoqilgan nuanslar, umid qilamanki, bu sizga yordam beradi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION