Dart'ta “const” ve “final” anahtar kelimeleri arasındaki fark nedir?
Fark, belleğin nasıl tahsis edildiği ile ilgilidir.
const değişkenleri derleme zamanında(compile time) değerlendirilirken final değişkenler çalışma zamanında(runtime) değerlendirilir.
const değişkenleri sabit bir değerle başlatılmalıdır, oysa final değişkenler çalışma zamanında belirlenen bir değerle başlatılabilir.
const değişkenlerin değeri ilan edilir edilmez belirlenir. Başlatıldıktan sonra değerini kullanmasanız bile bellekte yer kaplamaya devam eder. final değişkenleri ise tembel(lazily) olarak değerlendirilir, yani değerleri ilk kez erişilene kadar belirlenmez.
Const değişkenlerin birkaç ilginç özelliği ve kısıtlaması vardır:
Derleme zamanında hesaplanabilen verilerden oluşturulmaları gerekir. Bir const nesnesinin çalışma zamanında hesaplamanız gereken hiçbir şeye erişimi yoktur. 1 + 2 geçerli bir const ifadesidir, ancak new DateTime.now() değildir.
Bir const listeniz varsa, içindeki her şey de const olmalıdır.
Flutter'da const ve final'ı nasıl kullanabileceğinize dair bir örnek:
const int maxAttempts = 3; // Compile-time constant
final random = Random(); // Runtime constant
void main() {
// maxAttempts süresine kadar oturum açma girişimi
for (int i = 0; i < maxAttempts; i++) {
// 1 ile 10 arasında rastgele bir sayı üret
final password = random.nextInt(10) + 1;
if (attemptLogin(password)) {
break;
}
}
}
Bu örnekte maxAttempts, const anahtar sözcüğü kullanılarak bildirilen bir derleme zamanı sabitidir. Değeri derleme zamanında belirlenir ve çalışma zamanında değiştirilemez.
Öte yandan, random, final anahtar sözcüğü kullanılarak bildirilen bir çalışma zamanı sabitidir. İlk defa erişilene kadar değeri belirlenmez ve başlatıldıktan sonra değiştirilemez.
Genel olarak, derleme zamanında bilinen değerler için const, çalışma zamanında belirlenen değerler için final kullanmalısınız. Bu, derleyicinin kodunuzu optimize etmesine ve çalışma zamanında gereksiz hesaplamalardan kaçınmasına olanak tanır.
Kaynaklar
geeksforgeeks
openai
flutteragency
Top comments (0)