ProgramlamaAndroid/Kotlin Geliştirici

Kotlin'de sealed arayüzler nedir, nasıl ve neden kullanılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sealed arayüz — Kotlin'de, bir modül içinde uygulama sayısını sınırlamaya olanak tanıyan özel bir arayüz türüdür. Sealed sınıflar, Kotlin'de daha önce ortaya çıkmışken, sealed arayüzler, örneğin durum hiyerarşeleri veya olay işleme üzerinde daha fazla kontrol sağlamak için Kotlin 1.5 itibarıyla bir evrim olarak eklenmiştir.

Sorunun Tarihi

Geliştiriciler, sealed sınıfları, miras almayı sınırlamak ve güvenli hiyerarşiler oluşturmak için daha önce kullanıyordu. Ancak, birden fazla türden miras almanın faydalı olduğu yapılar için esnekliğe ihtiyaç duyulduğunda sealed arayüzler gerekli hale geldi.

Sorun

Sealed arayüzler olmadan, arayüzün alt sınıflarının kümesini esnek bir şekilde yönetmek mümkün değildir. Bu, örneğin, tümü arayüzlere dayalı olduğunda, durumları işlerken eksiksiz bir when kontrolünü imkansız hale getirir, yalnızca soyut/konkret sınıflar değil.

Çözüm

Sealed arayüz kullanmak şunları sağlar:

  • Sabit bir uygulama kümesini tanımlamak.
  • Tüm uygulamaların derleyici tarafından bilindiğini garanti etmek.
  • when kullanımında else dalı olmadan güvenli bir şekilde kullanmak — derleyici, kapsanmayan durumlar hakkında uyarıda bulunur.

Kod örneği:

sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Tıklama olayı") is Scroll -> println("Kaydırma olayı") }

Anahtar özellikler:

  • Geçerli uygulama setinin daraltılması ve kontrol edilmesi.
  • Aynı anda birden fazla sealed arayüzden miras alma olanağı.
  • Pattern matching (when) sırasında güvenlik.

Hileli Sorular.

Sealed arayüzlerin, tanımlandığı dosyanın dışında uygulamaları olabilir mi?

Hayır, sealed arayüzün uygulamaları aynı modül içinde olmalıdır. Bu, tam kapsayıcılığı sağlar ve derleyicinin sayısını kontrol etmesine olanak tanır.

Sealed arayüzler sınıflar ve nesnelerle nasıl etkileşimde bulunur?

Sealed arayüz, hem normal sınıflar hem de object-sınıflar tarafından, ayrıca data object (Kotlin 1.9+) ile uygulanabilir. Bu tür bir arayüz, birden fazla miras alma durumunda bulunabilir, bu sealed sınıf ile yapılamaz.

sealed interface Operation object Add: Operation object Subtract: Operation

Sealed arayüzler iç içe olabilir mi?

Evet, sealed arayüzü başka bir sealed sınıfın içinde veya başka arayüzlerin üstünde tanımlamak mümkündür. Önemli olan, tüm uygulamaların aynı modül içinde olmasıdır.

Tipik Hatalar ve Antipatternler

  • Sealed arayüzün uygulamalarını farklı modüllerde tanımlamak derleme hatalarına yol açar.
  • Sealed arayüzü, sealed sınıf gibi olduğu varsayımıyla kullanmaya çalışmak, çünkü sealed arayüz diğer arayüzlerden miras alınabilir.

Gerçek Hayattan Örnek

Olumsuz Durum

Bir uygulamada UI durumlarını sadece sealed-modifikatörü olmadan arayüzler olarak tanımladık. Bir uygulamayı unuttuk, statik analiz bu hatayı yakalayamadı; hata sadece prod ortamında ortaya çıktı.

Artıları:

  • Java arayüzlerinin alışılmış deseni.

Eksileri:

  • when içinde kapsayıcılık garantisi yok.
  • "Dışarıdan" uygulamaların ortaya çıkmasına karşı hassasiyet.

Olumlu Durum

Ekran olaylarının modeli için sealed arayüzlerin kullanımı. Tüm uygulamalar, modül içinde tek bir dosyada bulunmakta, derleyici, when içinde bir durum atlandığında kapatılmamış dallar hakkında uyarıda bulunmaktadır.

Artıları:

  • Tam tür güvenliği.
  • Destekleme ve genişletme kolaylığı.

Eksileri:

  • Sadece bir modül İngilizce içinde kullanılabilir.