Geçen ders classların yalın halini ele aldık. Şimdi biraz daha iç yapısından, daha farklı kullanımlarından bahsedeceğiz.
Parametre İstemek
Parametre isteme durumu Java programlama dilinden biraz daha farklı. Java’da class ile aynı isimde bir constructor sınıfı oluşturmak zorunlu idi. Yani siz oluşturmasanız bile java kendiliğinden arka planda bu fonksiyonu oluşturuyordu. Kotlin de bu durum hem biraz farklı hem de aynı aslında. Kotlinde constructor isminde bir constructor sınıfı oluşturuyoruz. Ve içerisinde aynı javadaki gibi atamalarını yapıyoruz. Örneğin yeni bir person classı oluşturalım
class Person { var age : Int var name : String var job : String constructor (ageInput : Int , nameInput : String , jobInput : String ) { this.age = ageInput this.name = nameInput this.job = jobInput } }
Şimdi oncreate içinde parametreleriyle birlikte çağıralım
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val volkan : Person = Person (20 , "Volkan", "Bilgisayar Mühendisi") System.out.println(volkan.name) }
Logcat’te göründüğü üzere “Volkan” yazacaktır. Person sınıfının bir nesnesi olan volkan nesnesinin name parametresini çağırmış olduk. (volkan.name ile)
Class tarafında ayrıca şöyle bir kolaylıkta mevcut. Class constructor methodunu direk classın yanında parantezde de oluşturabiliriz.
Class Person ( var age : Int , var name : String , var job : String) {}
Görüldüğü gibi bir class’ı böyle tek satırda yazabildik. Yani constructor’ını class parantezleri içerisinde tanımladık.
Kotlin Erişilebilirlik Seviyeleri (Visibility Modifiers)
Private : Sadece tanımlandığı sınıfta kullanılabilir
Protected : private + kalıtım aldığı sınıfta kullanılabilir.
İnternal : Bütün projeden ulaşılır. Ekstra kütüphanelerden vs. ulaşılamaz.
Public : Her yerden ulaşılabilir. Ayrıca default değerdir. Herhangi bir tanımlama yapıldığında derleyici otomatik public atar.
Bu şekilde javada 3 olan erişilebilirlik seviyesi kotlinde 4 olarak karşımıza çıkmaktadır. Private’ın kendi class’ına özel olduğunu göstermek için küçük bir örnek yapalım. Person class içerisine
private var hairColor : String = ""
onCreate içerisinde bunu setlemeye çalıştığımızda
volkan.hairColor = "Black"
HATA alacağız yani direkt olarak haircolor’u görmeyecek ve kırmızı olarak hatalı görünecektir. Ama başında eklediğimiz erişilebilirlik seviyesi olan private kaldırırsak public olacağından erişime açık olacaktır ve hata vermeyecektir.
NOT : Şimdi o zaman ben neden private kullanayım ki diyenler olabilir. Bir değişkeni private yaparak diğer classlardan doğrudan erişimini kaldırmış oluruz. Ama dolaylı olarak setter getter fonksiyonları ile erişim sağlayabiliriz ve kodumuz hem daha okunabilir hem de daha güvenli kod haline getirmiş oluruz.
Kotlin Nullability
Güvenli kod yazmak programlama dillerinde son derece önemlidir. Bir uygulama yazdığınızda bunun kullanıcaya herhangi bir crash , kesinti gibi problemler vermesini istemeyiz. Örnek verecek olursak bir değişken veya sabit initialize edilmez ise uygulama hata verip kendini kapatabilir.
Nullable veya non-null tipler vardır. Herhangi bir şeyi nullable yapmak için (?) kullanılır.
var myString : String? = null System.out.println (myString)
Ekranda manalı bir şey yazdırmaz. Boş manasına gelen null değerini döndürür. Ama hata da vermez. Kullanıcı uygulamayı kullanmaya rahatlıkla devam edebilir. ? kullanmasaydık hata verebilir. ? sayesinde myString hem null değer alabilir hem de String değer alabileceğini belirtmiş olduk.
var myAge : Int? = null System.out.println(myAge!! * 20)
Burada uygulama bize myAge’in değerinin null olabileceğini söylüyor. Bunu tekrar düzenlemem konusunda beni uyarıyor. Eğer ben kesin olarak değer geleceğinden eminsem (!!) ekleyerek kesinliği belirtiyorum. Tabi bunun kötü bir yanı var eğer değer gelmez ise yani null bir değer gelirse uygulama hata verir. Uygulama crash olur. Şimdi daha güvenli kod yazmak üzerinde biraz daha derine inelim.
Kotlin Güvenli Kod Yazma
Kotlin’de güvenli kod yazmanın anahtarı nasıl olacaktır. Eğer null değer kullanırsak null harici zorunlu bir değer isteyen işlemde uygulamamız patlıyordu. Null vermezsekte bir değer tanımlamadığımız için uygulama patlayabiliyordu. Güvenli kod yazmanın anahtarı kontrol etmektir. Bunu değer var mı yok mu şeklinde düşünebiliriz.
var myNumber : Int? = null if (myNumber != null) { System.out.println (myNumber*10) }else { System.out.println("myNumber is null") }
Bir diğer yöntem ise safe call yöntemidir. Yukarıdaki ile benzer mantıkta
System.out.println(myNumber?.compareTo(2))
Burada ise eğer denerseniz myNumber null’a eşitlendiği durumda işlem sonucunun null döndürdüğünü ama uygulamanın hata vermediğini görürsünüz.
3. yöntem ise Elvis yöntemidir. Bu yöntem ise tek satırda bu işlemi yap ya da belirlenen anlamsız bir değere ata mantığıdır.
val myResult =myNumber?.compareTo(2)?: -100 System.out.println(myResult)
Elvis işleminde de ben null dönsün istemiyorum yerine başka bir şey dönsün istiyorsam (bu örnek için -100) elvis kullanmış oluyorum.
Bu kodda da görüldüğü gibi kodun derleme hatası alma olasılığını ortadan kaldırıyoruz. Böylelikle güvenli bir kod yazmış oluyoruz.
Tüm sonuçların ekran görüntüsü bu şekilde