Menu
Coddy logo textTech

Statik Bloklar

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 17 / 87.

Bazen statik değişkenleri basit bir atamadan daha karmaşık bir mantıkla başlatmanız gerekir. Bir statik blok (statik başlatıcı olarak da adlandırılır), sınıf ilk yüklendiğinde, herhangi bir nesne oluşturulmadan veya statik metotlar çağrılmadan önce bir kez çalışır.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // Karmaşık başlatma mantığı
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

Statik blok, sınıf belleğe yüklendiğinde otomatik olarak çalışır. Kaç tane nesne oluşturursanız oluşturun, bu yalnızca bir kez gerçekleşir. Birden fazla ifade, hesaplama veya koşullu mantık gerektiren başlatma işlemleri için mükemmeldir.

Bir sınıf içinde birden fazla statik bloğa sahip olabilirsiniz ve bunlar göründükleri sırayla yürütülürler:

public class AppSettings {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

Statik bloklar; statik dizileri veya koleksiyonları başlatmak, hesaplama gerektiren yapılandırma değerlerini ayarlamak ve sınıf düzeyinde bir kerelik kurulum görevlerini gerçekleştirmek için yaygın olarak kullanılır.

challenge icon

Görev

Kolay

Sınıf ilk yüklendiğinde oyun ayarlarını başlatmak için statik blokları kullanan bir GameConfig sistemi oluşturalım. Bu, herhangi bir oyun nesnesi oluşturulmadan önce bir kez hesaplanması veya hazırlanması gereken yapılandırmalar için idealdir.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • GameConfig.java: Ayarlarını statik blokları kullanarak başlatan bir yapılandırma sınıfı oluşturun:
    • Her seviyeye ulaşmak için gereken skoru depolayan özel bir statik dizi levelThresholds (int[])
    • Toplam seviye sayısını depolayan özel bir statik değişken maxLevel (int)
    • Başlatmanın gerçekleşip gerçekleşmediğini izleyen özel bir statik değişken configLoaded (boolean)
    • maxLevel değerini 5 olarak başlatmak ve "Initializing game configuration..." yazdırmak için bir statik blok kullanın
    • levelThresholds değerine eşit boyutta maxLevel dizisi oluşturmak, ardından her seviyenin level * 100 puan gerektirmesi için diziyi doldurmak (1. seviye 100, 2. seviye 200 vb.) ve configLoaded değerini true olarak ayarlamak için ikinci bir statik blok kullanın
    • Bu seviye için skor eşiğini döndüren (seviyeler 1 tabanlıdır) bir statik metot getThreshold(int level)
    • En yüksek seviyeyi döndüren bir statik metot getMaxLevel()
    • Yapılandırmanın yüklenip yüklenmediğini döndüren bir statik metot isConfigLoaded()
  • Main.java: Sınıfa erişildiğinde statik blokların otomatik olarak çalıştığını gösterin. Bir girdi alacaksınız: sorgulanacak seviye numarası. Dört satır yazdırın:
    • Config loaded: true veya Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (1. seviyeyi de her zaman gösterin)

Bir girdi alacaksınız: sorgulanacak seviye numarası (int).

Başlatma mesajının Main kodunuzun herhangi bir bölümü çalışmadan önce yazdırıldığına dikkat edin; bunun nedeni, sınıf ilk yüklendiğinde statik bloğun çalıştırılmasıdır!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: Statik blok yürütmesini göstermek için GameConfig'e erişin
        // GameConfig içindeki statik bloklar, sınıfa ilk kez eriştiğinizde otomatik olarak çalışacaktır
        
        // TODO: Yapılandırmanın yüklenip yüklenmediğini yazdırın
        // Format: "Config loaded: true" veya "Config loaded: false"
        
        // TODO: Maksimum seviyeyi yazdırın
        // Format: "Max level: [maxLevel]"
        
        // TODO: Giriş seviyesi için eşik değerini yazdırın
        // Format: "Level [level] threshold: [threshold]"
        
        // TODO: Seviye 1 için eşik değerini yazdırın
        // Format: "Level 1 threshold: [threshold]"
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi