5-bo‘lim

Shartlar va switch

if va else, mantiqiy amallar, shartli operator, eski switch ko'rsatmasi, switch ifodasi va Java 21 dagi namuna moslashtirish.

🕑 15 daqiqa o‘qish 📄 772 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. if, else if, else
  2. Mantiqiy amallar
  3. Shartli operator
  4. Eski switch ko'rsatmasi
  5. switch ifodasi
  6. Namuna moslashtirish
  7. Shart bilan namuna
  8. instanceof bilan namuna
  9. null bilan ehtiyot bo'ling
  10. Xulosa

Shartlar har qanday dasturning asosi. Java'da if oddiy, switch esa so'nggi versiyalarda sezilarli kuchaygan.

if, else if, else #

Java
public class Baho {
    public static void main(String[] args) {
        int ball = 87;

        if (ball >= 90) {
            System.out.println("A'lo");
        } else if (ball >= 70) {
            System.out.println("Yaxshi");
        } else if (ball >= 60) {
            System.out.println("Qoniqarli");
        } else {
            System.out.println("Qoniqarsiz");
        }
    }
}
Natija
Yaxshi
Qavslarni tashlab ketmang

Java bitta ko'rsatma uchun { } ni talab qilmaydi:

Java
if (ball >= 70)
    System.out.println("Yaxshi");

Bu ishlaydi, lekin xavfli odat. Keyin ikkinchi qatorni qo'shsangiz, u shartdan tashqarida qoladi va buni sezish qiyin.

Bu mashhur xato: 2014-yilda Apple tizimidagi jiddiy xavfsizlik zaifligi aynan qavssiz if dan keyin ikkinchi qator qo'shilgani sababli yuzaga kelgan.

Har doim qavs qo'ying, hatto bitta qator bo'lsa ham.

Mantiqiy amallar #

Java
public class Mantiq {
    public static void main(String[] args) {
        int yosh = 20;
        boolean talabami = true;

        System.out.println(yosh >= 18 && talabami);
        System.out.println(yosh < 18 || talabami);
        System.out.println(!talabami);
    }
}
Natija
true
true
false
AmalMa'nosi
&&VA - ikkalasi ham rost bo'lsa
||YOKI - kamida bittasi rost bo'lsa
!EMAS - teskarisi
Qisqa tutashuv

&& va || qisqa tutashuv bilan ishlaydi: natija ma'lum bo'lganda o'ng tomon umuman hisoblanmaydi.

Java
public class Qisqa {
    public static void main(String[] args) {
        String ism = null;

        if (ism != null && ism.length() > 3) {
            System.out.println("Uzun ism");
        } else {
            System.out.println("Ism yo'q yoki qisqa");
        }
    }
}
Natija
Ism yo'q yoki qisqa

Birinchi shart yolg'on bo'lgani uchun ism.length() umuman chaqirilmadi - aks holda dastur qulardi.

Java'da & va | ham bor, lekin ular ikkala tomonni ham hisoblaydi. Shart tekshirishda deyarli har doim && va || ishlatiladi.

Shartli operator #

Java
public class Uchlik {
    public static void main(String[] args) {
        int ball = 87;
        String natija = ball >= 60 ? "o'tdi" : "o'tmadi";

        System.out.println("Talaba " + natija);

        int a = 15, b = 23;
        System.out.println("Kattasi: " + (a > b ? a : b));
    }
}
Natija
Talaba o'tdi
Kattasi: 23

Eski switch ko'rsatmasi #

Java
public class EskiSwitch {
    public static void main(String[] args) {
        int kun = 3;

        switch (kun) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                System.out.println("Ish kuni");
                break;
            case 6:
            case 7:
                System.out.println("Dam olish");
                break;
            default:
                System.out.println("Noma'lum");
        }
    }
}
Natija
Ish kuni
break ni unutish - klassik xato

Eski switch da har bir case dan keyin break yozilmasa, bajarilish keyingi case'ga o'tib ketadi:

Java
public class Otish {
    public static void main(String[] args) {
        int kun = 6;

        switch (kun) {
            case 6:
                System.out.println("Shanba");
            case 7:
                System.out.println("Yakshanba");
            default:
                System.out.println("Tugadi");
        }
    }
}
Natija
Shanba
Yakshanba
Tugadi

Faqat "Shanba" kutilgan edi, lekin uchalasi ham chiqdi. Bunga fall-through deyiladi.

Ba'zan u ataylab ishlatiladi (yuqoridagi 1-5 kunlar kabi), lekin ko'pincha bu shunchaki unutilgan break. Kompilyator ogohlantirmaydi.

Yechim - keyingi bo'limdagi yangi switch ifodasi: unda bu muammo umuman yo'q.

switch ifodasi #

Java 14 dan switch qiymat qaytaradi va break talab qilmaydi:

Java
public class YangiSwitch {
    public static void main(String[] args) {
        int kun = 3;

        String nom = switch (kun) {
            case 1 -> "Dushanba";
            case 2 -> "Seshanba";
            case 3 -> "Chorshanba";
            case 4 -> "Payshanba";
            case 5 -> "Juma";
            case 6, 7 -> "Dam olish kuni";
            default -> "Noma'lum";
        };

        System.out.println(nom);
    }
}
Natija
Chorshanba
BelgiMa'nosi
->Shu holat uchun qaytariladigan qiymat
case 6, 7Bir nechta qiymatni birlashtiradi
defaultQolgan barcha holatlar
Yangi switch xavfsizroq

Uchta sabab:

  1. break kerak emas - fall-through mumkin emas;
  2. Qiymat qaytaradi - oraliq o'zgaruvchi yozish shart emas;
  3. To'liqlik tekshiriladi - enum bilan ishlaganda barcha holat qamralmasa, kompilyator xato beradi.

Uchinchisi eng qimmatlisi: enum ga yangi qiymat qo'shsangiz, kompilyator uni unutgan barcha switch larni ko'rsatib beradi.

Bir nechta ko'rsatma kerak bo'lsa yield ishlatiladi:

Java
public class Yield {
    public static void main(String[] args) {
        int ball = 95;

        String izoh = switch (ball / 10) {
            case 10, 9 -> {
                String asos = "A'lo";
                yield asos + " (" + ball + " ball)";
            }
            case 8, 7 -> "Yaxshi";
            default -> "Qoniqarli";
        };

        System.out.println(izoh);
    }
}
Natija
A'lo (95 ball)

Namuna moslashtirish #

Java 21 dan switch turlarni ham tekshira oladi:

Java
import java.math.BigDecimal;

public class Namuna {
    public static void main(String[] args) {
        Object[] narsalar = {
                42, "salom", 3.14, true, 'A', new BigDecimal("1.5")
        };

        for (Object narsa : narsalar) {
            String tavsif = switch (narsa) {
                case Integer son -> "butun son: " + son;
                case String matn -> "satr, uzunligi " + matn.length();
                case Double kasr -> "kasr son: " + Math.round(kasr);
                case Boolean mantiq -> "mantiqiy: " + mantiq;
                case Character belgi -> "belgi: " + belgi;
                default -> "boshqa tur: "
                        + narsa.getClass().getSimpleName();
            };

            System.out.println(tavsif);
        }
    }
}
Natija
butun son: 42
satr, uzunligi 5
kasr son: 3
mantiqiy: true
belgi: A
boshqa tur: BigDecimal

Har bir holatda tur tekshirildi va qiymat mos turdagi o'zgaruvchiga yozildi - alohida aylantirish kerak bo'lmadi.

default qachon ishlaydi

Oxirgi qiymat - BigDecimal. Unga mos case yozilmagani uchun default ishladi va tur nomini chiqardi.

Diqqat: getClass().getSimpleName() ni faqat nosozliklarni qidirishda ishlating. Ba'zi turlarning haqiqiy sinf nomi yashirin bo'ladi - masalan List.of(1, 2) uchun u ListN deb chiqadi, bu esa JDK ning ichki tafsiloti va versiyaga qarab o'zgarishi mumkin.

Dastur mantiqini hech qachon sinf nomi matniga bog'lamang - switch yoki instanceof bilan turning o'zini tekshiring.

Shart bilan namuna #

when qo'shib, namunaga qo'shimcha shart berish mumkin:

Java
public class Shartli {
    public static void main(String[] args) {
        Object[] qiymatlar = {5, -3, 0, "uzun matn", "qisqa"};

        for (Object q : qiymatlar) {
            String natija = switch (q) {
                case Integer son when son > 0 -> "musbat son: " + son;
                case Integer son when son < 0 -> "manfiy son: " + son;
                case Integer son -> "nol";
                case String matn when matn.length() > 6 -> "uzun satr";
                case String matn -> "qisqa satr: " + matn;
                default -> "boshqa";
            };

            System.out.println(natija);
        }
    }
}
Natija
musbat son: 5
manfiy son: -3
nol
uzun satr
qisqa satr: qisqa
Tartib muhim

Namunalar yuqoridan pastga tekshiriladi va birinchi mos kelgani ishlaydi.

Yuqorida case Integer son ni eng yuqoriga qo'ysangiz, when li holatlar hech qachon ishlamaydi - kompilyator buni sezadi va "namuna kirib bo'lmas" degan xato beradi.

Qoida: eng tor shartni yuqoriga, eng kengini pastga.

instanceof bilan namuna #

switch dan tashqari if da ham namuna ishlatiladi:

Java
public class Instanceof {
    public static void main(String[] args) {
        Object narsa = "Namangan";

        // eski uslub
        if (narsa instanceof String) {
            String matn = (String) narsa;
            System.out.println("Eski:  " + matn.length());
        }

        // yangi uslub - Java 16 dan
        if (narsa instanceof String matn) {
            System.out.println("Yangi: " + matn.length());
        }

        if (narsa instanceof String m && m.startsWith("Nam")) {
            System.out.println("Shart bilan: " + m);
        }
    }
}
Natija
Eski:  8
Yangi: 8
Shart bilan: Namangan

Yangi shakl tekshiradi va bir vaqtda o'zgaruvchiga yozadi - alohida aylantirish qatori kerak emas.

null bilan ehtiyot bo'ling #

Java
public class NullSwitch {
    public static void main(String[] args) {
        String[] qiymatlar = {"ha", null};

        for (String q : qiymatlar) {
            String javob = switch (q) {
                case null -> "qiymat berilmagan";
                case "ha" -> "rozi";
                case "yo'q" -> "rad etildi";
                default -> "tushunarsiz";
            };

            System.out.println(javob);
        }
    }
}
Natija
rozi
qiymat berilmagan
Eski switch null da qulaydi

Java 21 gacha switch ga null bersangiz, NullPointerException chiqardi - default ham yordam bermasdi.

Java 21 dan case null yozish mumkin bo'ldi. Lekin uni yozmasangiz, eski xatti-harakat saqlanadi: null baribir istisno tashlaydi.

Ya'ni default sizni null dan himoya qilmaydi. Agar qiymat null bo'lishi mumkin bo'lsa, case null ni oshkora yozing.

Amaliy topshiriq
  1. Ball bo'yicha baho beruvchi if/else if zanjirini yozing.
  2. Qavssiz if xatosini o'zingiz yaratib ko'ring.
  3. Qisqa tutashuvni null misolida tekshiring.
  4. Eski switch da break ni olib tashlab, fall-through ni ko'ring.
  5. Xuddi shu mantiqni yangi switch ifodasi bilan yozing.
  6. yield bilan bir nechta ko'rsatmali holat yozing.
  7. Object massivi ustida tur namunalarini qo'llang.
  8. when bilan musbat, manfiy va nolni ajrating.
  9. instanceof ning eski va yangi shaklini solishtiring.
  10. switch ga null berib, case null siz va u bilan sinab ko'ring.

Xulosa #

  • if dan keyin har doim qavs qo'ying.
  • && va || qisqa tutashuv qiladi: null tekshiruvini birinchi yozing.
  • Eski switch da break unutilsa, bajarilish keyingi holatga o'tib ketadi.
  • switch ifodasi (->) qiymat qaytaradi, break talab qilmaydi va enum uchun to'liqlikni tekshiradi.
  • Bir nechta ko'rsatma kerak bo'lsa yield.
  • Java 21 dan switch turlarni tekshira oladi; when bilan qo'shimcha shart qo'yiladi.
  • Namunalar yuqoridan pastga tekshiriladi - eng tor shart yuqorida.
  • case null ni oshkora yozing; default null dan himoya qilmaydi.

Keyingi bo'limda sikllarni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.