by operatörü ile arayüz delegasyonu, bir sınıfın arayüz üzerindeki tüm çağrıları belirli bir vekil nesneye yönlendirmesine olanak tanır. Bu, kodun tekrarını azaltır ve bileşim (composition) desenini uygular.
Örnek:
interface Logger { fun log(message: String) } class ConsoleLogger: Logger { override fun log(message: String) = println("LOG: $message") } class Service(logger: Logger): Logger by logger { fun doWork() { log("Service is working") } } val service = Service(ConsoleLogger()) service.doWork() // LOG: Service is working
Özellik delegasyonundan farklar:
val/var x by ...) belirli bir özelliğe uygulanır ve vekil arayüzünü (örneğin, ReadWriteProperty) uygulama gerektirir.Artıları:
Eksileri:
Arayüz delegasyonu (
by), bir nesneyi alan aracılığıyla arayüzü uygulamaktan nasıl farklıdır?
Cevap:
Delegasyon (by ile) otomatik olarak arayüzün tüm yöntemlerini delege nesne üzerinden uygular. Eğer yalnızca delege nesnesini bir alan olarak saklayıp yöntemlerini manuel olarak çağırırsanız, arayüzün her yöntemini elle yazmanız gerekir - bu da tekrar ve hatalara yol açar. Ayrıca, by ile delegasyon daha fazla okunabilirlik ve daha az boilerplate kodu sunar:
// Delegasyon olmadan class Service2(private val logger: Logger): Logger { override fun log(message: String) = logger.log(message) }
Hikaye
Projede Logger arayüzü için el ile dekoratör deseni uygulanmaya çalışıldı, arayüze sonradan eklenen bir ek yöntemi uygulamayı unuttular. Proje derlendi ama yeni fonksiyon çalışmadı, çünkü uygulama "boştu". by ile arayüz delegasyonu bu hatanın önüne geçerdi: Tüm yeni yöntemler otomatik olarak delege tarafından uygulanırdı.
Hikaye
by ile arayüz delegasyonunda, geliştirici arayüzün bir yöntemini yeniden tanımladı, ancak diğer yöntemlerin yine de delege üzerinden geçtiğini unuttu. Sonuç olarak, bir kısım fonksiyon "olağan dışı" çalıştı - hata işlevsel iş metotlarında uzun süre yakalanamadı.
Hikaye
by ile çakışan yöntemlere sahip birden fazla arayüz delegasyonu uygulamaya çalıştılar, çakışma oluştu - derleyici belirsizlik hatası vermeye başladı, yoksa proje derlenemedi, tekrarlanan yöntemleri açıkça yeniden tanımlamak zorunda kaldılar.