👨‍💻Kotlin Lateinit ve by Lazy

Tüm Kotlin geliştiricilerinin bilmesi gereken Lateinit ve Lazy farkları!

Hüseyin Özkoç
Huawei Developers - Türkiye
3 min readApr 11, 2023

--

Kotlin’de Lateinit ve by Lazy arasındaki farklar nelerdir?

😮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!

Temel bir lateinit kullanım örneği.
Yukarıdaki örneğin LogCat üzerindeki çıktısı.

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!

Değerimizi initialize ettiğimiz yeri yorum satırına alalım ve olacakları tekrardan inceleyelim.
Değerimizi initialize etmediğimiz için hata ile karşılaştık.

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.

Basit isInitialized kullanımı.

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!

Basitçi lazy kullanımı.
Yukarıdaki kodun LogCat’teki çıktısı.

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!

Referanslar

--

--