Menu
Coddy logo textTech

Late Değişkenler

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 19 / 110.

late anahtar kelimesi Dart'a, null olamaz (non-nullable) bir değişkenin hemen atanmamış olsa bile kullanılmadan önce başlatılacağını söyler. Bu, bir alanı bildirimde veya yapıcıda (constructor) başlatamadığınızda, ancak erişilmeden önce bir değere sahip olacağından emin olduğunuzda yararlıdır.

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // Hello, Alice!

late olmadan, Dart username değişkeninin başlatılmadığından şikayet ederdi. late belirleyicisi, onu okumadan önce bir değer atayacağınızın sözünü verir.

late anahtar kelimesinin bir diğer faydası da tembel başlatmadır (lazy initialization). Başlatıcısı olan late bir değişken, ilk kez erişilene kadar değerini hesaplamaz:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // "Loading..." burada yazdırılır, ardından "default"

loadSettings() yöntemi yalnızca settings'e ilk kez erişildiğinde çalışır, nesne oluşturulduğunda değil. Yine de dikkatli olun; bir late değişkenine başlatılmadan önce erişmek bir çalışma zamanı hatası fırlatır.

challenge icon

Görev

Kolay

late değişkenlerini kullanarak hem ertelenmiş başlatmayı (deferred initialization) hem de tembel başlatmayı (lazy initialization) gösteren bir veritabanı bağlantı yöneticisi oluşturalım.

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

  • database.dart: Bir veritabanı bağlantısını simüle eden bir Database sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Nesne oluşturulduktan sonra ayarlanacak olan bir late String connectionString
    • Checking connection... yazdıran ve 'Connected' değerini döndüren, tembel başlatıcıya (lazy initializer) sahip bir late String status
    • connectionString değerini ayarlayan ve Connection configured: [connectionString] yazdıran bir connect(String connStr) metodu
    • Executing on [connectionString]: [sql] yazdıran bir query(String sql) metodu
    • Status: [status] yazdıran bir checkStatus() metodu (bu, ilk çağrıda tembel başlatmayı tetikleyecektir)
  • main.dart: Veritabanı sınıfınızı içe aktarın ve late anahtar kelimesinin her iki kullanımını da gösterin:
    • Bir Database örneği oluşturun
    • Database object created yazdırın
    • 'localhost:5432/mydb' bağlantı dizesi ile connect() metodunu çağırın
    • 'SELECT * FROM users' ile query() metodunu çağırın
    • Tembel başlatmayı tetiklemek için checkStatus() metodunu çağırın

connectionString değerinin nesne oluşturulduktan sonra manuel olarak nasıl ayarlandığına, status değerinin ise yalnızca ilk erişildiğinde değerini nasıl hesapladığına dikkat edin.

Beklenen çıktı:

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

Kopya kağıdı

late anahtar kelimesi, kullanılmadan önce daha sonra başlatılacak olan null olamayan değişkenler tanımlamanıza olanak tanır:

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
}

User user = User();
user.initialize('Alice');

Gecikmeli Başlatma (Lazy Initialization): Bir başlatıcıya sahip late değişkeni, değerini yalnızca ilk erişildiğinde hesaplar:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();  // loadSettings() henüz çağrılmadı
print(config.settings);     // loadSettings() burada çağrıldı

Uyarı: Bir late değişkenine başlatılmadan önce erişmek, bir çalışma zamanı hatası fırlatır.

Kendin dene

import 'database.dart';

void main() {
  // TODO: Bir Database örneği oluşturun
  
  // TODO: 'Database object created' yazdırın
  
  // TODO: 'localhost:5432/mydb' ile connect() metodunu çağırın
  
  // TODO: 'SELECT * FROM users' ile query() metodunu çağırın
  
  // TODO: Tembel başlatmayı (lazy initialization) tetiklemek için checkStatus() metodunu çağırın
}
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