JetBrains, Kotlin 2.5.0'da türle ilişkili üyelerin tanımlanma biçimini genişletmek ve farklı Kotlin platformları arasındaki birlikte çalışabilirliği iyileştirmek amacıyla Companion Blocks ve Companion Extensions adlı iki yeni mekanizmayı test ediyor. Şirket, yeni tasarımın geleneksel Companion Objects kullanılarak kolayca kullanılamayan programlama kalıplarının önünü açtığını belirtiyor.
Yeni mekanizma ne ekliyor?
Türle ilişkili üyeler; sıfır vektörünü temsil eden bir sabit veya belirli bir açıya göre vektör oluşturan bir işlev gibi, tek bir nesneye ait olmayan sabitleri, yardımcı araçları ve oluşturma işlevlerini tanımlamak için kullanılır. Daha önce bu kullanım Companion Objects'e dayanıyordu; yeni companion blokları ise bu tür üyelerin tanımını doğrudan türün içinde yapmaya daha yakın bir sözdizimiyle yazmayı mümkün kılıyor.
Companion Extensions ise geliştirici özgün kodun sahibi olmasa bile herhangi bir sınıfa veya arayüze türle ilişkili üyeler eklenmesine olanak tanıyor; bu, tür Java'dan geliyor veya başlangıçta bir Companion Object içermiyor olsa dahi mümkün. Böylece harici türler, temel tanımları değiştirilmeden genişletilebiliyor.
Derleme ve uyumluluk değişiklikleri
Yeni mekanizma, derleme stratejisi bakımından Companion Objects'ten farklıdır. JVM platformunda Companion Blocks, static üyeler olarak derlenir; bu da davranışlarını diğer platformlardaki statik üyelere yaklaştırır. JetBrains, bunun Kotlin Multiplatform'a fayda sağlayabileceğini düşünüyor; çünkü beklenen üyeler bir companion bloğunda tanımlanabilir ve ardından static üyeler içeren bir Java sınıfı kullanılarak gerçekleştirilebilir.
Ancak özellikler hâlâ deneyseldir. Companion Blocks'u etkinleştirmek için -Xcompanion-blocks seçeneğinin, bloklarla uzantıların birlikte kullanılması içinse -Xcompanion-blocks-and-extensions seçeneğinin etkinleştirilmesi gerekir.
Deneysel kullanım kısıtlamaları
Companion Extensions kullanıldığında derleyici, sürüm öncesi ikili dosyalar üretir. Buna bağlı olarak, özellik resmen kararlı hâle gelene kadar diğer projeler veya kütüphaneler bu uzantıları kullanan kütüphaneleri bağımlılık olarak tüketemeyebilir. Aynı kısıtlama Companion Blocks'un açığa çıkarılması için geçerli değildir; ancak bunların kullanıcılarının da özelliği etkinleştirmesi gerekir.
Companion Objects taşınmalı mı?
JetBrains hemen geçiş yapılmasını önermiyor. Companion Objects hâlâ Kotlin'in temel bir parçasıdır ve bunlara tam destek verileceği garanti edilmektedir. Companion Blocks çoğu durumda yeni kod için tercih edilen seçenek olabilir; ancak companion'ın bir arayüz uygulaması gerektirmesi gibi belirli durumlarda Companion Objects gerekli olmaya devam eder, çünkü bunlar tam bir sınıfa derlenir.
Pratikte birçok durumda Companion Block'a geçmek için object sözcüğünü silmek yeterli olabilir; ancak projenin ve ona bağlı tüm kodların yeniden derlenmesi gerekir. JetBrains ayrıca ekosistemdeki bazı araçların yeni sözdizimini işlemeye henüz hazır olmayabileceği konusunda uyarıyor.
Bu gelişme neden önemli?
Değişiklik, JVM ile diğer platformlardaki statik üye kavramı arasındaki farkı azaltmaya çalıştığı için Kotlin Multiplatform geliştiricileri ve kütüphane yazarları açısından önemlidir. Ancak pratik değeri şu anda deneysel aşamaya ve derleme araçlarıyla kütüphanelerin ve düzenleyicilerin ne kadar hızlı güncelleneceğine bağlı olmaya devam ediyor. Bu nedenle Companion Blocks, özellik kararlı hâle gelmeden geniş çaplı bir geçişin güvenli temeli olarak değil, tasarımı denemek ve değerlendirmek için uygun görünüyor.