👨💻Kotlin Lateinit ve by Lazy
Tüm Kotlin geliştiricilerinin bilmesi gereken Lateinit ve Lazy farkları!
😮Birçok geliştirici, lateinit ile lazy arasındaki farkı bildiklerini söylese de, aslında pek çok kişi aradaki farkı bilmiyor. Peki, sen onlardan biri misin?
Giriş
Merhaba Sevgili Kotlin severler! Yeni makaleme hoş geldiniz. Bugün size Kotlin’de lateinit ve By Lazy arasındaki farklardan bahsedeceğim. Öncelikle bu iki ana konunun açıklamaları ve örnekleri üzerinden geçeceğim. Sonra, hangisini nerede kullanmamız gerektiğine odaklanacağım. Hazırsanız başlayalım!
Lateinit
Değerlerimizi tanımlarken initialize etmek istemeyebiliriz, bunun yerine bunları uygulamamızda daha sonra herhangi bir zamanda initialize etmek ve kullanmak isteyebiliriz. Ancak değerimizi kullanmadan önce, değerimizin kullanılabilmesi için önce initialize olması gerektiğini unutmamalıyız. Daha iyi anlamak için bir örnek yapalım!
Yukarıdaki örnekte gördüğümüz gibi, değerimizi tanımalarken initialize etmedik. Bunun yerine, uygulamamızın OnCreate() fonksiyonunda initialize ediyoruz ve print() yöntemiyle değerimizi LogCat’e yazdırıyoruz. Peki ya değerimizi initialize etmeden LogCat’e yazdırmaya çalışırsak? Deneyelim ve görelim!
Yukarıda görüldüğü gibi değerimize initialize etmeden erişmeye çalışırsak “UninitializedPropertyAccessException” hatası ile karşılaşırız. Bu hatayı önlemek için Kotlin’in bize sağladığı isInitialized() yöntemini de kullanabiliriz.
Gördüğünüz gibi, ihtiyacınız varsa, değerimin initialize olup olmadığını kontrol etmek için isInitialized’ı kullanabilirsiniz.
By Lazy
Lazy initialization, yazılım dünyasında sıklıkla karşılaştığımız bir tasarım modelidir. Lazy initialization ile, nesneleri yalnızca onlara ilk eriştiğimizde oluşturabiliriz, aksi takdirde onları initialize etmemiz gerekmez. Oluşturulması pahalı olan nesnelerin, uygulama başlangıcında değil, yalnızca kullanılacakları yerde initialize edilmesini sağlar.
Kotlin’de lazy, bir sınıf içinde bir nesne oluşturmak istediğimizde, ancak bu nesne oluşturmanın pahalı olduğu ve bu pahalı nesneye bağımlı olan nesnenin oluşturulmasında gecikmeye yol açabileceği bir senaryoda kullanışlıdır. Bu nedenle, nesnenin yalnızca ilk kez erişildiğinde başlatılacağını, aksi takdirde başlatılmayacağını anlamamız gerekir.
Daha iyi anlamak için bir örnek yapalım!
Yukarıdaki örnekte gördüğümüz gibi, nesnemize erişmeye çalıştığımızda değerimiz yalnızca bir kez initialize edildi ve ardından her tıklamada bu başlatılan nesneyi kullandık.
Lateinit ve Lazy arasındaki farklar nelerdir?
1- “lateinit” mutable(var) değişken özellikleriyle sınırlandırılırken, “lazy” değiştiricisi sadece read-only(val) ile kullanılır.
2- “lateinit” ile işaretlenmiş bir değere runtime sırasında birçok kez atama yapılabilirken, “lazy” ile başlatılan bir değere ilk kullanımında yalnızca bir kez değer atanabilir.
3- Primitif bir veri türünü “lateinit” değere tanımlamak mümkün değilken, “lazy” bir değer Primitif veya Primitif olmayan veri türünden olabilir. (Int gibi)
4- “lateinit” değerler için thread güvenliğini(thread safe) sağlamak mümkün değilken, “lazy” değerler için SYNCHRONIZED, PUBLICATION, NONE gibi senkronizasyon seçeneklerinden birini seçebiliyoruz. (Bu yüzden Singleton tasarım modelini kullanırken lazy kullanıyoruz.)
5- “lateinit” değerler nullable olarak tanımlanamazlar lakin “lazy” hem nullable hemde non-nullable şeklinde tanımlanabilir.
6- Bir “lateinit” değerler özelleştirilmiş bir getter’a sahip olamazken, “lazy” bir değer, değer ilk çağrıldığında çalışan bir kod bloğu içerir.
7- Initialize olmadan önce bir “lateinit” özelliğine erişmeye çalışmak, değerin initialize olmadığını belirten bir hata ile sonuçlanır. Öte yandan, “lazy” bir değere, initialize olmadan önce erişilemez. “lazy” bir özelliğin null olabileceğini, ancak yine de değerin ilk kez erişildiğinde initialize olacağını unutmamak önemlidir.
Sonuç
Sonuç olarak, Lateinit ve Lazy basit ama geliştiriciler tarafından anlaşılmayan iki kavramdır. Bu nedenle bu yazıda iki konuyu örneklerle anlattım ve aralarındaki farktan bahsettim. Umarım siz geliştiriciler için faydalı bir yazı olmuştur! Kendinize iyi bakın!