Enumerasyon (Enums)

Enumerasyonlar veya kısaca enums olarak adlandırılan, sabit değerleri temsil etmek için kullanılan özel bir sınıf türüdür.

Not

Tüm enums otomatik olarak Enum sınıfını genişletir. Aynı zamanda mühürlüdürler, yani alt sınıf olarak belirlenemez, uygulanamaz, karıştırılamaz veya başka bir şekilde açıkça örneklendirilemezler.

Soyut sınıflar ve mixin'ler Enum'ı açıkça uygulayabilir veya genişletebilir, ancak bir enum bildirisinde uygulanmadıkça veya karıştırılmadıkça, o sınıfın veya mixin'in türünü hiçbir nesne gerçekten uygulayamaz.

Basit Enumerasyon (Simple Enums)

Basit bir numaralandırılmış türü bildirmek için enum anahtar kelimesini kullanın ve numaralandırmak istediğiniz değerleri listeleyin:

enum Renk { kirmizi, yesil, mavi }

Gelişmiş Enumerasyon (Enchanced Enums)

Dart ayrıca enum bildirimlerinin, final alanlar, yöntemler ve belirli sayıda bilinen sabit örneklerle sınırlı olan sınıfları bildirmelerine izin verir.

Gelişmiş bir enum bildirmek için, normal sınıflarla benzer bir sözdizimini izleyin, ancak birkaç ek gereksinime sahip:

  • Örnek değişkenleri final olmalıdır, bunlar arasında mixin'ler tarafından eklenenler de dahil.

  • Tüm üretici kurucular sabit olmalıdır.

  • Fabrika kurucuları yalnızca sabit, bilinen enum örneklerinden birini döndürebilir.

  • Enum otomatik olarak genişletildiği için başka bir sınıf genişletilemez.

  • index, hashCode, eşitlik operatörü == için geçersiz kılma olmamalıdır.

  • Bir enum'da values adında bir üye bildirilemez, çünkü bu, otomatik olarak oluşturulan static values getter ile çakışacaktır.

  • Enum'un tüm örnekleri bildirimin başında belirtilmelidir ve en az bir örnek bildirilmelidir.

  • Gelişmiş bir enumdaki örnek yöntemleri, bu'yi kullanarak geçerli enum değerine başvurabilir.

Aşağıda, çoklu örnekler, örnek değişkenler, getter'lar ve uygulanan bir arayüzle bir gelişmiş enum bildiren bir örnek bulunmaktadır:

enum Arac implements Comparable<Arac> {
  araba(lastikler: 4, yolcular: 5, karbonKilometreBasina: 400),
  otobus(lastikler: 6, yolcular: 50, karbonKilometreBasina: 800),
  bisiklet(lastikler: 2, yolcular: 1, karbonKilometreBasina: 0);

  const Arac({
    required this.lastikler,
    required this.yolcular,
    required this.karbonKilometreBasina,
  });

  final int lastikler;
  final int yolcular;
  final int karbonKilometreBasina;

  int get karbonAyakizi => (karbonKilometreBasina / yolcular).round();

  bool get ikiTekerlekli => this == Arac.bisiklet;

  @override
  int compareTo(Arac diger) => karbonAyakizi - diger.karbonAyakizi;
}

Enumerasyon Kullanma

Numaralandırılmış değerlere diğer statik değişkenler gibi erişebilirsiniz:

final begenilenRenk = Renk.mavi;
if (begenilenRenk == Renk.mavi) {
  print('En sevdiğin renk mavi!');
}

Her enum'daki her değerin bir index getter'ı vardır, bu da değerin enum bildirisindeki sıfır tabanlı konumunu döndürür. Örneğin, ilk değer index 0'a, ikinci değer index 1'e sahiptir.

assert(Renk.kirmizi.index == 0);
assert(Renk.yesil.index == 1);
assert(Renk.mavi.index == 2);

Tüm numaralandırılmış değerlerin bir listesini almak için enum'un values sabitini kullanın.

List<Renk> renkler = Renk.values;
assert(renkler[2] == Renk.mavi);

Enum'ları switch ifadelerinde kullanabilirsiniz ve enum'un tüm değerlerini işlemezseniz bir uyarı alırsınız:

var birRenk = Renk.mavi;

switch (birRenk) {
  case Renk.kirmizi:
    print('Gül gibi kırmızı!');
  case Renk.yesil:
    print('Çimen gibi yeşil!');
  default: // Bu olmadan, BİR UYARI görürsünüz.
    print(birRenk); // 'Renk.mavi'
}

Bir numaralandırılmış değerin adına erişmeniz gerekiyorsa, örneğin Renk.mavi'den 'mavi'yi kullanmak için .name özelliğini kullanın:

print(Renk.mavi.name); // 'mavi'

Enum değerinin bir üyesine normal bir nesne gibi erişebilirsiniz:

print(Arac.araba.karbonAyakizi);

Last updated