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.
Görev
KolaySı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 kurulması gereken yapılandırmalar için mükemmeldir.
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 puanı saklayan özel bir statik dizi
levelThresholds(int[]) - Toplam seviye sayısını saklayan özel bir statik değişken
maxLevel(int) - Başlatmanın gerçekleşip gerçekleşmediğini izlemek için özel bir statik değişken
configLoaded(boolean) maxLeveldeğerini 5 olarak başlatmak ve"Initializing game configuration..."yazdırmak için bir statik blok kullanınlevelThresholdsdizisinimaxLevelboyutunda oluşturmak için ikinci bir statik blok kullanın, ardından her seviyelevel * 100puan gerektirecek şekilde doldurun (seviye 1 için 100, seviye 2 için 200, vb.) veconfigLoadeddeğerinitrueolarak ayarlayın- O seviye için puan eşiğini döndüren statik bir
getThreshold(int level)metodu (seviyeler 1 tabanlıdır) - Maksimum seviyeyi döndüren statik bir
getMaxLevel()metodu - Yapılandırmanın yüklenip yüklenmediğini döndüren statik bir
isConfigLoaded()metodu
- Her seviyeye ulaşmak için gereken puanı saklayan özel bir statik dizi
Main.java: Sınıfa erişildiğinde statik blokların otomatik olarak çalıştığını gösterin. Bir girdi alacaksınız: sorgulanacak bir seviye numarası. Dört satır yazdırın:Config loaded: trueveyaConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](her zaman seviye 1'i de gösterin)
Bir girdi alacaksınız: sorgulanacak seviye numarası (int).
Başlatma mesajının Main kodunuz çalışmadan önce nasıl yazdırıldığına dikkat edin - bu, sınıf ilk yüklendiğinde çalışan statik bloktur!
Kopya kağıdı
Bir statik blok (veya statik başlatıcı), sınıf ilk yüklendiğinde, herhangi bir nesne oluşturulmadan veya statik metotlar çağrılmadan önce bir kez çalışır. Birden fazla ifade gerektiren karmaşık başlatma mantığı için kullanılır.
public class Example {
private static String value;
static {
// Başlatma mantığı
value = "initialized";
System.out.println("Static block executed");
}
}Statik bloklar, sınıf belleğe yüklendiğinde otomatik olarak çalışır ve kaç nesne oluşturulduğuna bakılmaksızın yalnızca bir kez yürütülür.
Bir sınıfta birden fazla statik blok bulunabilir. Göründükleri sırayla yürütülürler:
public class Example {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}Yaygın kullanım alanları arasında statik dizilerin veya koleksiyonların başlatılması, hesaplama gerektiren yapılandırma değerlerinin ayarlanması ve sınıf düzeyinde bir kerelik kurulum görevlerinin gerçekleştirilmesi yer alı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]"
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı