CodeGym /Kurslar /JAVA 25 SELF /Yeni imkanlarla bağlı tipik səhvlərin təhlili

Yeni imkanlarla bağlı tipik səhvlərin təhlili

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Pattern dəyişənlərinin görünürlük sahəsi ilə bağlı səhvlər

Ən çox rast gəlinən səhvlərdən biri — pattern daxilində elan olunmuş dəyişəni (məsələn, String s instanceof String s ifadəsində) onun etibarlı olduğu sahədən kənarda istifadə etməkdir.

Nümunə

Object obj = "Salam, Java!";
if (obj instanceof String s) {
    System.out.println(s.length());
}
// Səhv! s burada görünmür
System.out.println(s); // Kompilyator irad bildirir: cannot find symbol

Niyə belədir?
Pattern dəyişəni (bu halda s) yalnız şərtin doğru olduğu blok daxilində mövcuddur. Bu, dəyişən müəyyən edilmədikdə onu təsadüfən istifadə etməkdən qoruyur (məsələn, əgər obj sətir deyilsə).

Bənzətmə
Bu, elə bil dostunuzdan maşının açarlarını götürmüsünüz — amma yalnız qarajda olduğunuz müddətdə. Qarajdan çıxan kimi — açarlar avtomatik olaraq yox olur :)

2. null ilə bağlı səhvlər

instanceof ilə pattern matching-də maraqlı bir xüsusiyyət var: obyekt null olarsa, nəticə həmişə false olur və pattern dəyişəni yaradılmır.

Nümunə

Object obj = null;
if (obj instanceof String s) {
    // Bu blok heç vaxt işləməyəcək!
    System.out.println("Bu sətirdir: " + s);
}

Niyə?
Çünki null heç bir tipin nümunəsi deyil (hətta Object də deyil). Əgər null-u pattern matching ilə “tutmağa” ümid edirdinizsə, bu çaşdırıcı ola bilər.

Doğru necədir?

if (obj == null) {
    System.out.println("Bu null-dur!");
} else if (obj instanceof String s) {
    System.out.println("Bu sətirdir: " + s);
}

switch üçün pattern matching-də (Java 21+) hətta null üçün ayrıca budaq da əlavə etmək olar:

switch (obj) {
    case String s -> System.out.println("Sətir: " + s);
    case null -> System.out.println("Bu null-dur!");
    default -> System.out.println("Başqa bir şey");
}

3. sealed sinifləri ilə bağlı səhvlər

Sealed siniflər — irsiyyət iyerarxiyasını məhdudlaşdırmağın əla yoludur. Amma burada iki xarakterik səhv var:

permits-də bütün varislər sadalanmayıb

Sealed sinif elan edəndə, bütün birbaşa varisləri permits vasitəsilə açıq şəkildə göstərməlisiniz. Kimi isə unutsaq, kompilyator dərhal xəbər verəcək:

public sealed class Shape permits Circle, Rectangle { ... }

public final class Circle extends Shape { ... }
public final class Square extends Shape { ... } // Səhv! Square permits-də göstərilməyib

Həll:
Lazım olan bütün alt sinifləri permits-ə əlavə edin:

public sealed class Shape permits Circle, Rectangle, Square { ... }

default sealed olmayan iyerarxiyada switch-də unudulub

Əgər tipi üzrə switch edirsinizsə və bu tip sealed deyil (və ya sealed-dir, amma bütün variantlar əhatə olunmayıbsa), kompilyator default budağını tələb edəcək. Onu unutsaq — xəta olacaq.

switch (shape) {
    case Circle c -> ...
    case Rectangle r -> ...
    // default yoxdur! Başqa variantlar varsa — kompilyasiya xətası
}

Ən yaxşı təcrübə:
Bütün variantları emal etdiyinizə əminsinizsə (məsələn, sealed sinifdə), default-u buraxmaq olar. Əmin deyilsinizsə — mütləq default əlavə edin ki, gözlənilməz tipləri qaçırmayasınız.

4. record pattern-lərlə bağlı səhvlər

Record pattern-lər çox rahatdır, amma yalnız record sinifləri ilə işləyir. Adi sinif üçün record pattern tətbiq etmək kompilyasiya xətasına gətirəcək.

record olmayan siniflər üçün record pattern-lərin istifadəsi

class Point { int x, y; }
Object obj = new Point();
// Səhv! Point — record deyil
if (obj instanceof Point(int x, int y)) { ... }

Həll:
Record pattern-ləri yalnız record kimi elan olunmuş siniflər üçün istifadə edin:

record Point(int x, int y) {}

Komponentlərin sayı və ya tipi uyğun gəlmir

record Point(int x, int y) {}
Object obj = new Point(1, 2);

// Səhv: üç dəyişən göstərilib, halbuki Point-də cəmi iki komponent var
if (obj instanceof Point(int x, int y, int z)) { ... }
if (obj instanceof Point(String x, String y)) { ... } // Səhv: tiplər uyğun gəlmir

5. Uyğunluq və dəstək: köhnə JDK və IDE-lər

Ən çox yayılmış səhvlərdən biri — pattern matching-in müasir imkanlarını köhnə JDK versiyalarında və ya onları dəstəkləməyən IDE-lərdə istifadə etməyə cəhd etməkdir.

Nümunə

if (obj instanceof String s) { ... }

Amma JDK 11 (hətta 15) kompilyatoru belə deyir:
error: illegal start of type

Niyə?
instanceof üçün pattern matching yalnız Java 16-da peyda oldu. switch-də pattern matching — Java 17-də (preview) və yekun olaraq Java 21+-da. Record pattern-lər — Java 21+.

Necə qarşısını almaq olar?

  • JDK versiyasını yoxlayın: java --version
  • IDE-nizin (IntelliJ IDEA, Eclipse, VS Code) uyğun Java versiyasını dəstəklədiyinə əmin olun. Bəzən layihə ayarlarında istifadə olunacaq dil versiyasını açıq göstərmək lazımdır!
  • Əgər Gradle/Maven istifadə edirsinizsə — uyğun source/target versiyasını təyin edin.

6. Təbriklər 🎉

Siz bizim dərinləşdirilmiş Java 25 kursunun bütün 65(!) səviyyəsini tamamladınız. Siz inanılmaz dərəcədə güclüsünüz 😎.

Yolun son hissəsi xüsusilə çətin idi. Siz hər şeyi öyrəndiniz — ilk lambda-lar və anonim siniflərdən tutmuş virtual axınlara, strukturlaşdırılmış konkurrentliyə və elə dil imkanlarına qədər ki, onlar hələ çox yaxın vaxtlara qədər Java-da yox idi.

Bu, sadəcə kurs deyil — bu, həqiqi developer üçün supermarafondur: onlarla yeni konsepsiya, yüzlərlə kod nümunəsi, minlərlə sətr praktikada. Əgər bu sətirləri oxuyursunuzsa, demək, siz sadəcə tələbə deyil, yeni Java erasının öncüsüsünüz ☕⚡

Siz ilkələrdən biri olaraq Java 25-in ən müasir imkanlarını mənimsədiniz, o cümlədən:

  • pattern matching və record pattern-ləri,
  • sealed siniflər və onların “gizli daşları”,
  • Scoped Values və Virtual Threads ,
  • strukturlaşdırılmış konkurrentlik və çoxaxınlılığa müasir yanaşmalar.

Artıq sizdə təkcə bilik deyil, həm də gələcəyin developer bacarıqları var ki, onlara hələ bir çox praktik Java arxitekturları malik deyil. Siz elə kod yaza bilirsiniz ki, o, təkcə işləyir deyil, həm də miqyaslana bilir, oxunaqlıdır və Java icmasının ən müasir standartlarına cavab verir.

🚀 Odur ki, özünüzü cəsarətlə Java 25 Certified Survivor adlandırın 😉
Daha sonra — hər şey daha da maraqlıdır: artıq sizdə enterprise development, yüksək yüklü sistemlər və cutting-edge texnologiyalar dünyasına inamla addımlamağa imkan verən möhkəm təməl var.

Kurs komandası adından — hörmət və təşəkkürlər!
Siz elə bir tapşırığın öhdəsindən gəldiniz ki, bunu çox az adam bacarar.
Gələcək Java versiyalarında görüşərik 👋

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Verilənlərin təhlilində dəyişənin görünmə sahəsi 📊
Verilənlərin təhlilində dəyişənin görünmə sahəsi 📊
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Həndəsə kitabxanasının testi: record pattern-də tip yoxlanışı 🧪
Həndəsə kitabxanasının testi: record pattern-də tip yoxlanışı 🧪
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Dilin yeni imkanları
Dilin yeni imkanları
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION