Menu
Coddy logo textTech

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 atanamaz

name, 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.

challenge icon

Görev

Kolay

final 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 bir Product sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • 0.08 değerine ayarlanmış bir static const double taxRate (tüm ürünler arasında paylaşılan %8 vergi oranı)
    • 'USD' değerine ayarlanmış bir static 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 bir final String sku (stok tutma birimi)
    • name ve basePrice alanlarını alan bir yapıcı metot (constructor)
    • Vergi dahil fiyatı hesaplayan bir priceWithTax alı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.99 olan bir 'Laptop'
    • Taban fiyatı 29.99 olan bir 'Mouse'
    Yukarıda listelenen sırayla her ürün üzerinde display() metodunu çağırın.

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ı olabilir
  • static const: Derleme zamanı sabitleri, tüm örnekler arasında paylaşılır
  • Örnek alanları (instance fields) doğrudan const olamaz - yalnızca static const kullanı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)
  
}
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