Final ve Const Alanlar
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 18 / 110.
Bir sınıfta alanları tanımlarken, başlatıldıktan sonra değerlerin değişip değişemeyeceğini kontrol etmek için final veya const kullanabilirsiniz. Her ikisi de değişmez değerler oluşturur, ancak farklı şekilde çalışırlar.
Bir final alan yalnızca bir kez ayarlanabilir, ancak değeri çalışma zamanında belirlenir. Onu bildirim sırasında veya bir yapıcı (constructor) aracılığıyla atayabilirsiniz:
class Person {
final String name;
final DateTime createdAt = DateTime.now();
Person(this.name);
}
Person p = Person('Alice');
// p.name = 'Bob'; // Hata: final alan yeniden atanamazname, nesne oluşturulduğunda ayarlanır ve createdAt geçerli zamanı yakalar. Her iki değer de başlatma işleminden sonra kilitlenir.
Bir static const alan, derleme zamanında bilinen bir değere sahip olmalıdır. Sınıfın kendisine aittir ve tüm örnekler arasında paylaşılır:
class Circle {
static const double pi = 3.14159;
final double radius;
Circle(this.radius);
double get area => Circle.pi * radius * radius;
}Temel fark: final alanlar çalışma zamanında hesaplanan değerleri (DateTime.now() gibi) tutabilirken, const derleme zamanı sabitleri gerektirir. Örnek alanları doğrudan const olamaz; sınıf düzeyinde yalnızca static const kullanımına izin verilir.
Görev
Kolayfinal ve static const alanları arasındaki farkı gösteren bir ürün kataloğu sistemi oluşturalım. Değiştirilemez özelliklere ve paylaşılan yapılandırma değerlerine sahip ürünler oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
product.dart: Bir mağazadaki öğeyi temsil eden birProductsınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:0.08değerine ayarlanmış birstatic const double taxRate(tüm ürünler arasında paylaşılan %8 vergi oranı)'USD'değerine ayarlanmış birstatic const String currency- Ürün adı için bir
final String name(yapıcı metot aracılığıyla ayarlanır) - Ürünün taban fiyatı için bir
final double basePrice(yapıcı metot aracılığıyla ayarlanır) - Bir öneki ürün adıyla birleştiren, bir başlatıcı listesinde (initializer list)
'SKU-'ve ardından büyük harfli ürün adı olarak hesaplanan birfinal String sku(stok tutma birimi) namevebasePricealanlarını alan bir yapıcı metot (constructor)- Vergi dahil fiyatı hesaplayan bir
priceWithTaxalıcısı (getter) - Ürün bilgilerini yazdıran bir
display()metodu
main.dart: Ürün sınıfınızı içe aktarın ve iki ürün oluşturun:- Taban fiyatı
999.99olan bir'Laptop' - Taban fiyatı
29.99olan bir'Mouse'
display()metodunu çağırın.- Taban fiyatı
display() metodu tam olarak şu formatta yazdırmalıdır:
[sku] - [name]: [basePrice] [currency] (with tax: [priceWithTax] [currency])Görüntülerken toStringAsFixed(2) kullanarak priceWithTax değerini 2 ondalık basamağa yuvarlayın.
Beklenen çıktı:
SKU-LAPTOP - Laptop: 999.99 USD (with tax: 1079.99 USD)
SKU-MOUSE - Mouse: 29.99 USD (with tax: 32.39 USD)Kopya kağıdı
Çalışma zamanında bir kez ayarlanan ve sonradan değiştirilemeyen alanlar için final kullanın. Bir sınıfın tüm örnekleri arasında paylaşılan derleme zamanı sabitleri için static const kullanın.
final alanlar çalışma zamanında ayarlanır ve bildirimde veya yapıcıda (constructor) başlatılabilir:
class Person {
final String name;
final DateTime createdAt = DateTime.now();
Person(this.name);
}static const alanlar derleme zamanı sabit değerlerine sahip olmalı ve sınıfın kendisine ait olmalıdır:
class Circle {
static const double pi = 3.14159;
final double radius;
Circle(this.radius);
double get area => Circle.pi * radius * radius;
}final alan değerlerini bir başlatıcı listesinde (initializer list) hesaplayabilirsiniz:
class Product {
final String name;
final String sku;
Product(this.name) : sku = 'SKU-${name.toUpperCase()}';
}Temel farklar:
final: Çalışma zamanı değerleri, her örnek için farklı olabilirstatic const: Derleme zamanı sabitleri, tüm örnekler arasında paylaşılır- Örnek alanları (instance fields) doğrudan
constolamaz - yalnızcastatic constkullanımına izin verilir
Kendin dene
import 'product.dart';
void main() {
// TODO: 999.99 taban fiyatı ile 'Laptop' adında bir Product oluşturun
// TODO: 29.99 taban fiyatı ile 'Mouse' adında bir Product oluşturun
// TODO: Her bir ürün üzerinde sırasıyla display() metodunu çağırın (önce Laptop, sonra Mouse)
}
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ı