CodeGym /Kurslar /JAVA 25 SELF /İlkinləşdirmə blokları

İlkinləşdirmə blokları

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

1. İlkinləşdirmə blokları nədir

Java-da iki tip ilkinləşdirmə bloku var:

  • Qeyri-statik (adi) ilkinləşdirmə blokları — hər yeni obyekt yaradıldıqda yerinə yetirilir, sahələr ilkinləşdirildikdən dərhal sonra və konstruktor çağırılmadan əvvəl.
  • Statik ilkinləşdirmə blokları — sinif yaddaşa yüklənəndə bir dəfə icra olunur (ilk obyekt yaradılmadan və ya statik sahə/metodlara müraciətdən əvvəl).

Qeyri-statik ilkinləşdirmə bloku

Sinfin gövdəsində sadəcə elan olunur, static kimi sözlər olmadan:

public class User {
    private String name;

    // Qeyri-statik ilkinləşdirmə bloku
    {
        System.out.println("Qeyri-statik blok icra olunur!");
        name = "Susmaya görə ad";
    }

    public User() {
        System.out.println("Konstruktor icra olunur!");
    }
}

Statik ilkinləşdirmə bloku

static açar sözü ilə elan olunur:

public class Config {
    public static String appName;

    static {
        System.out.println("Statik blok icra olunur!");
        appName = "Mənim super tətbiqim";
    }
}

2. İlkinləşdirmə ardıcıllığı: əsas kimdir?

Java-da sinif elementlərinin ilkinləşdirilməsi — bu, sadəcə «nə gəldi» deyil, dəqiq müəyyən olunmuş bir ardıcıllıqdır. Heç vaxt IKEA mebelini təlimatsız yığmağa cəhd etmisinizsə, bu ardıcıllığın niyə vacib olduğunu anlayacaqsınız: addımları qarışdırsanız, şkaf əvəzinə art-obyekt alınacaq.

İlkinləşdirmə ardıcıllığı:

  1. Statik sahələr və statik bloklar — sinifdə elan olunma ardıcıllığı ilə. Sinif yüklənərkən bir dəfə icra olunur.
  2. Qeyri-statik sahələr və qeyri-statik bloklar — elan olunduqları ardıcıllıqla, hər yeni obyekt yaradıldıqda.
  3. Konstruktor — bütün qeyri-statik ilkinləşdirmələrdən sonra icra olunur.

Sxematik olaraq

+-------------------------------+
|   Sinfin JVM-ə yüklənməsi     |
+-------------------------------+
| 1. Statik sahələr             |
| 2. Statik bloklar             |
|         ↓                     |
|   Obyektin yaradılması        |
|         ↓                     |
| 3. Qeyri-statik sahələr       |
| 4. Qeyri-statik bloklar       |
| 5. Konstruktor                |
+-------------------------------+

Çıxışla nümunə

Gəlin baş verənlərin ardıcıllığını göstərən bir sinif yazaq:

public class Demo {
    static String staticField = print("1. static sahə");

    static {
        print("2. static blok");
    }

    String field = print("3. qeyri-statik sahə");

    {
        print("4. qeyri-statik blok");
    }

    public Demo() {
        print("5. konstruktor");
    }

    static String print(String msg) {
        System.out.println(msg);
        return msg;
    }

    public static void main(String[] args) {
        System.out.println("İlk Demo obyekti yaradırıq:");
        Demo d1 = new Demo();

        System.out.println("\nİkinci Demo obyekti yaradırıq:");
        Demo d2 = new Demo();
    }
}

Ekranda nə olacaq?

1. static sahə
2. static blok
İlk Demo obyekti yaradırıq:
3. qeyri-statik sahə
4. qeyri-statik blok
5. konstruktor

İkinci Demo obyekti yaradırıq:
3. qeyri-statik sahə
4. qeyri-statik blok
5. konstruktor

Diqqət yetirin: statik hissələr (static) yalnız bir dəfə — sinifə ilk müraciət zamanı icra olunur. static olmayan hər şey isə obyekt yaradılan hər dəfə icra edilir.

3. Kod nümunələri: ilkinləşdirmə blokları niyə lazımdır

Konstruktor kifayət etməyəndə

Bəzən ilkinləşdirmənin bir hissəsi bütün konstruktorlar üçün ümumi olmalıdır. Məsələn, sinifin bir neçə konstruktoru var və siz eyni ilkinləşdirməni hər birinə kopyalamaq istəmirsiniz. Bu halda onu qeyri-statik bloka çıxarmaq əlverişlidir:

public class Person {
    private String id;
    private String name;

    {
        // Bu kod istənilən konstruktordan əvvəl icra olunacaq
        id = java.util.UUID.randomUUID().toString();
        System.out.println("Unikal id yaradırıq: " + id);
    }

    public Person() {
        System.out.println("Person() parametrlərsiz");
    }

    public Person(String name) {
        this.name = name;
        System.out.println("Person(String name)");
    }
}

Nəticə: hər hansı bir Person obyekti yaradılarkən əvvəlcə id generasiya olunacaq, sonra isə lazımi konstruktor icra ediləcək.

Mürəkkəb statik məlumatların ilkinləşdirilməsi

Statik blok çox vaxt «ağır» və ya mürəkkəb statik sahələrin ilkinləşdirilməsi üçün istifadə olunur; məsələn, fayldan konfiqurasiyanın oxunması, kolleksiyaların yaradılması, bazaya qoşulma və s.

public class Settings {
    public static final java.util.Map<String, String> DEFAULTS;

    static {
        DEFAULTS = new java.util.HashMap<>();
        DEFAULTS.put("theme", "light");
        DEFAULTS.put("language", "ru");
        System.out.println("Settings-in statik bloku: susmaya görə sazlamalar");
    }
}

4. Faydalı incəliklər

İlkinləşdirmə bloklarından nə vaxt istifadə etməli

Nə vaxt istifadə etmək məqsədəuyğundur

  • Bütün konstruktorlar üçün lazım olan ümumi ilkinləşdirmə üçün.
  • Sadə təyin etmə ilə ifadə edilə bilməyən mürəkkəb statik məlumatlar üçün.
  • Statik resursların ilkinləşdirilməsi üçün (məsələn, tətbiq işə düşəndə konfiqurasiya faylının oxunması).

Nə vaxt istifadə ETMƏMƏK lazımdır

  • Adi təyin etmə və ya konstruktor kifayət edirsə — onları istifadə edin.
  • Biznes məntiqini ilkinləşdirmə bloklarında «gizlətməyin» — bu, kodun oxunmasını və dəstəyini çətinləşdirir.
  • İlkinləşdirmə konstruktor parametrlərindən asılıdırsa, onu məhz konstruktorun özündə edin.

İlkinləşdirmə bloklarından sui-istifadə etməyin

İlkinləşdirmə blokları güclüdür, amma çox da tez-tez lazım olmur. Əksər hallarda sadə təyin etmə və ya konstruktor kifayət edir. Sinifdə çox sayda ilkinləşdirmə bloku varsa, kod oxunmaz və dəstəklənməsi çətin olur.

Konstruktorun parametrlərindən asılı olan məntiq üçün qeyri-statik blokdan istifadə etməyin

Qeyri-statik blokda konstruktorun parametrlərindən istifadə etmək olmaz, çünki o, konstruktordan ƏVVƏL icra olunur. Parametrlərə əsasən nəsə ilkinləşdirməyiniz lazımdırsa, bunu konstruktorda edin.

Statik bloklar və irsiyyət

İlkinləşdirmənin statik blokları irs alınmır. Hər sinfin öz statik bloku var. Törəmə sinif yüklənəndə əvvəlcə bazanın statik bloku, sonra isə törəmənin statik bloku icra olunur.

5. İlkinləşdirmə blokları ilə işləyərkən tipik səhvlər

Səhv №1: Qeyri-statik blokun konstruktor parametrlərini «görəcəyini» gözləmək.
Bir çox yeni başlayan qeyri-statik blokda konstruktor parametrlərindən istifadə etməyə çalışır, lakin kompilyasiya xətası və ya gözlənilməz nəticə alır. Yadda saxlayın: qeyri-statik blok konstruktordan ƏVVƏL icra olunur, deməli hələ heç bir parametr yoxdur.

Səhv №2: İlkinləşdirmə bloklarında çox məntiq.
Əgər ilkinləşdirmə bloklarında mürəkkəb məntiq yaranırsa, kod dolaşıq olur. Əsas işi konstruktorda və ya ayrıca metodlarda görmək daha yaxşıdır.

Səhv №3: Müxtəlif ardıcıllıqda bir neçə statik blok.
Əgər sinifdə bir neçə statik blok varsa, onlar kodda elan olunduqları ardıcıllıqla, statik sahələrlə birlikdə icra olunurlar. Bəzən bu, gözlənilməz nəticələrə gətirir, məsələn, bir blok digərinin nəticəsindən asılı olduqda.

Səhv №4: Statik blokun hər obyekt yaradıldıqda icra olunacağını gözləmək.
static-blok yalnız bir dəfə — sinif yüklənəndə icra olunur. Təkrar ilkinləşdirməyə ümid edirsinizsə, bu baş verməyəcək.

Səhv №5: Statik blokdan qeyri-statik sahələrə müraciət etmək cəhdi.
Statik blokda yalnız statik dəyişənlər və metodlar əlçatandır. Qeyri-statik (adi) sahələrə müraciət etməyə cəhd kompilyasiya xətasına səbəb olacaq.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
İnkapsulyasiya
İnkapsulyasiya prinsipləri
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION