ProgramlamaKotlin geliştirici, Backend geliştirici, Android geliştirici

Kotlin'da sealed arayüzler nasıl uygulanmıştır? Ne amaçla kullanılır, nasıl kullanılır ve sealed sınıflardan neyle ayrılır?

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

Cevap.

Sealed arayüzler, Kotlin'de (1.5 sürümünden itibaren) arayüzün tek bir dosya içinde olası uygulamalarını sınırlamak için kullanılan oldukça yeni bir özelliktir. Kotlin'de başlangıçta, kalıtım hiyerarşisini sıkı bir şekilde kontrol eden ve kapsamlı işleme (örneğin, when ifadelerinde) kolaylık sağlayan sealed sınıflar vardı.

Sorun, bazen mimarinin temel bir sınıf yerine aynı kısıtlama ile bir arayüze ihtiyaç duymasıydı. Sealed arayüzler olmadan, derleyicinin kısıtlamalarına uymanın tek yolu sealed class kullanmaktı, bu da her zaman nesne alanı modeline iyi uymuyordu, özellikle çoklu kalıtım veya davranışların arayüzler üzerinde ayrıştırılmasına ihtiyaç duyulduğunda.

Çözüm: Sealed arayüzler, tüm uygulamalarının aynı dosya içinde tanımlanması gereken bir arayüz tanımlamaya olanak tanır. Bu, kodun güvenliğini artırır ve durumlar veya olaylar hiyerarşisini kontrol etmeyi ve gezinmeyi kolaylaştırır.

Kod örneği:

sealed interface NetworkState class Success(val data: String) : NetworkState class Error(val code: Int) : NetworkState object Loading : NetworkState

Anahtar özellikler:

  • sealed arayüzler yalnızca aynı dosya içinde uygulanabilir;
  • sealed arayüzler durum saklamaz, ancak uygulamaları durumlu sınıflar veya nesneler olabilir;
  • sealed arayüz için kapsamlı when ifadesi işleme.

Şıkları olan sorular.

Sealed arayüz farklı bir dosyada uygulanabilir mi?

Hayır. Sealed sınıflar gibi, sealed arayüzler de yalnızca kendilerinin tanımlandığı aynı dosya içinde uygulanabilir. Dosyanın dışındaysa, bu tür bir arayüzü uygulama girişimi derleme hatasına yol açar.

Sealed arayüz bir sınıftan kalıtım alabilir mi?

Hayır, arayüzler yalnızca diğer arayüzlerden kalıtım alabilir. Ancak sealed arayüz, başka bir (sealed) arayüzden kalıtım alabilir.

Sealed arayüz çoklu uygulamayı destekler mi?

Evet, bu dosyanın içinde bir sınıf birden fazla sealed arayüzünü uygulayabilir veya eğer dil kuralları izin veriyorsa, hem sealed arayüzü hem de sealed sınıfı aynı anda kalıtım alabilir.

Tipik hatalar ve anti-patentler

  • Sealed arayüzün tanımlama dosyasının dışındaki bir dosyada uygulanması (derleyici buna izin vermez).
  • Artan sıkı kontrol için sealed arayüzlerin kötüye kullanılması - aşırı karmaşıklığa yol açabilir.
  • Sealed arayüzün doğrudan örneklerini oluşturmaya çalışmak - imkansızdır: yalnızca somut uygulamalar/nesneler.

Gerçek hayattan bir örnek

Negatif durum

Ağ olaylarını işleme sisteminde, geliştirici sıradan arayüzler ve sealed sınıfları karıştırarak kullanır; sonuç olarak "dağınık" bir hiyerarşi ve kod tekrarları oluşur. when ifadeleri bir else dalı içerme zorunluluğu taşır.

Artılar:

  • Hızlı entegre edilen mimari
  • Uygulama esnekliği

Eksiler:

  • Hiyerarşinin kontrolsüz genişlemesi
  • when ifadeleri derleyici tarafından kapsamlı kapsama kontrol edilmez

Pozitif durum

Aynı uygulamada, tüm uygulamaları tek bir dosyaya yerleştirerek sealed interface NetworkEvent'e geçiliyor. Artık NetworkEvent için when ifadeleri tüm durumların işlenmesini gerektiriyor. Kod, daha okunabilir, sürdürülebilir ve güvenli hale geliyor.

Artılar:

  • Hiyerarşi üzerinde tam kontrol
  • Derleme aşamasında durumların kapsamlı işlenmesini destekleme

Eksiler:

  • Tüm uygulamalar bir dosya içinde olmalı, bu da çok sayıda alternatif olduğunda dosya boyutunu artırıyor.