Nullable ve Non-Nullable
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 24 / 110.
Artık null güvenliğinin neden önemli olduğunu anladığınıza göre, null tutabilen değişkenlerin nasıl bildirileceğine bakalım. Dart'ta, tür adından sonra bir ? ekleyerek bir türü null yapılabilir hale getirirsiniz.
String name = 'Alice'; // Null olamaz - her zaman bir değere sahip olmalıdır
String? nickname; // Null olabilir - null veya bir String olabilir
print(name); // Alice
print(nickname); // nullTemel fark, null yapılamayan (non-nullable) türlerin bir değerin varlığını garanti etmesi, null yapılabilir (nullable) türlerin ise açıkça bir değerin yokluğuna izin vermesidir. Bu ayrım tüm türler için geçerlidir:
int count = 10; // Bir değere sahip olmalı
int? optionalCount; // Null olabilir
List<String> items = []; // Bir liste olmalı (boş olabilir)
List<String>? maybeItems; // Null olabilir (hiç liste olmayabilir)Boş bir listenin [], null değerinden farklı olduğuna dikkat edin. Boş bir liste mevcuttur ancak hiçbir şey içermez; null hiçbir listenin mevcut olmadığı anlamına gelir.
Derleyici bu kuralları sıkı bir şekilde uygular. Boş değer atanamaz (non-nullable) bir değişkene null atayamazsınız ve önce null kontrolü yapmadan, boş değer atanabilir (nullable) bir değişkeni, boş değer atanamaz (non-nullable) bir değişkenin beklendiği yerde kullanamazsınız:
String? maybeName = 'Bob';
// String definite = maybeName; // Hata! Nullable bir tür, non-nullable bir türe atanamazBir sonraki derste, null olabilir (nullable) değerlerle güvenli bir şekilde çalışmak için Dart'ın sunduğu operatörleri öğreneceksiniz.
Görev
KolayNullable (boş bırakılabilir) ve non-nullable (boş bırakılamaz) türleri kullanarak, zorunlu bilgiler ile isteğe bağlı bilgiler arasındaki farkı gösteren bir film izleme listesi sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
movie.dart: İzleme listenizdeki bir filmi temsil eden birMoviesınıfı tanımlayın. Her filmin bir başlığı ve yayın yılı olmalıdır (bunlar her zaman zorunludur), ancak bazı ek ayrıntılar her film için mevcut olmayabilir. Sınıfınız şunlara sahip olmalıdır:- Non-nullable bir
String title- her filmin bir başlığı olmalıdır - Non-nullable bir
int year- her filmin bir yayın yılı olmalıdır - Nullable bir
String? director- yönetmen bilinmiyor olabilir - Nullable bir
double? rating- tüm filmler henüz puanlanmamış olabilir titleveyearalanlarını zorunlu parametreler olarak alan bir yapıcı (constructor)- Filmin bilgilerini yazdıran, eksik yönetmen için
"Unknown"ve eksik puan için"Not rated"gösteren birdisplayInfo()metodu
- Non-nullable bir
main.dart: Film sınıfınızı içe aktarın ve hem tam hem de eksik film verilerini gösteren küçük bir izleme listesi oluşturun:- Başlığı
'Inception've yılı2010olan bir film oluşturun, ardından yönetmenini'Christopher Nolan've puanını8.8olarak ayarlayın - Başlığı
'The Matrix've yılı1999olan bir film oluşturun, ardından sadece puanını8.7olarak ayarlayın (yönetmeni null olarak bırakın) - Başlığı
'Upcoming Film've yılı2025olan bir film oluşturun (hem yönetmeni hem de puanı null olarak bırakın) - Yukarıda listelenen sırayla her film üzerinde
displayInfo()metodunu çağırın
- Başlığı
displayInfo() metodu tam olarak şu formatta yazdırmalıdır:
[title] ([year])
Director: [director or "Unknown"]
Rating: [rating or "Not rated"]Non-nullable alanların (title ve year) her zaman değerlere sahip olmasının nasıl garanti edildiğine, nullable alanların (director? ve rating?) ise ayarlanmadan kalabildiğine dikkat edin. Bu, bazı verilerin temel, bazılarının ise isteğe bağlı olduğu gerçek dünya senaryolarını yansıtır.
Beklenen çıktı:
Inception (2010)
Director: Christopher Nolan
Rating: 8.8
The Matrix (1999)
Director: Unknown
Rating: 8.7
Upcoming Film (2025)
Director: Unknown
Rating: Not ratedKopya kağıdı
Dart'ta bir türü null olabilir (nullable) yapmak için, tür adından sonra bir ? ekleyin:
String name = 'Alice'; // Null olamaz - her zaman bir değeri olmalıdır
String? nickname; // Null olabilir - null veya bir String olabilirBu ayrım tüm türler için geçerlidir:
int count = 10; // Bir değeri olmalıdır
int? optionalCount; // Null olabilir
List<String> items = []; // Bir liste olmalıdır (boş olabilir)
List<String>? maybeItems; // Null olabilir (hiç liste yok)Boş bir liste [], null değerinden farklıdır. Boş bir liste mevcuttur ancak hiçbir şey içermez; null ise hiç liste olmadığı anlamına gelir.
Derleyici, null güvenliği (null safety) kurallarını sıkı bir şekilde uygular. Null olamaz (non-nullable) bir değişkene null atayamazsınız ve null olabilir (nullable) bir değişkeni, önce null kontrolü yapmadan null olamaz bir değişkenin beklendiği bir yerde kullanamazsınız:
String? maybeName = 'Bob';
// String definite = maybeName; // Hata! Null olabilir bir değer, null olamaz bir değişkene atanamazKendin dene
import 'movie.dart';
void main() {
// TODO: 'Inception' başlıklı ve 2010 yılına ait bir film oluşturun
// Ardından yönetmenini 'Christopher Nolan' ve puanını 8.8 olarak ayarlayın
// TODO: 'The Matrix' başlıklı ve 1999 yılına ait bir film oluşturun
// Ardından sadece puanını 8.7 olarak ayarlayın (yönetmeni null olarak bırakın)
// TODO: 'Upcoming Film' başlıklı ve 2025 yılına ait bir film oluşturun
// Hem yönetmeni hem de puanı null olarak bırakın
// TODO: Her film üzerinde sırasıyla displayInfo() metodunu çağırın
}
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 DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarı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ıRepository Kalıbı