🚀
Kotlin'in Java'ya Göre Avantajları (Kotlin vs Java)
Kotlin’i Java’ya nazaran daha kullanışlı, avantajlı (ve havalı) kılan nedir, Kotlin'in avantajları nelerdir, neden Android için Kotlin kullanmalıyız? (kotlin vs java, java vs kotlin).

🏂 Kotlin Dünyasına Giriş

  • 👁️ Açık kaynaklıdır (Java 13 kapalı, openJDK hariç)
  • 🕰️ Java 8 eskidir, java 13 çıkmıştır
  • 🚀 Proje Kotlin dahi olsa Java sınıfları oluşturabilirsin
  • 💫 Java kodlarını Convert Java File to Kotlin komutu ile Kotlin kodlarına çevirebilirsin
  • 💁‍♂️ Tüm paketi çevirmek için paketi seç ve bu komutu kullan
  • 👀 Neden geçmen gerektiğini öğrenmek için yazıyı okumaya devam et
📢 Çok büyük projeleri parça parça geçirmeniz tavsiye edilir

✨ Değişken Tanımlaması

  • 💦 Java'daki final yapısı yerine daha sade bir arayüz sunar
  • 🚀 Değişken türlerinin tanımlanmasına gerek yoktur
  • 😱 Fonksiyon değişkenleri tanımlanabilir
  • ⚡ Statik değişkenler için scope sunar
  • 🕐 Daha sonra tanımlanacak değişkenler oluşturulabilir (lateinit)
🧐 Size birini mi anımsattı? (🐍 Python)
1
var metin = "yemreak" // String metin = "yemreak"
2
var metin: String = "yemreak" // String metin = "yemraek"
3
val metin = "değişmem" // final String metin = "değişmem"
4
5
/*
6
Foo
7
bar
8
*/
9
val uzunMetin = """
10
Foo
11
Bar
12
""".trimIndent()
13
14
/*
15
if(a > 1) {
16
return a
17
}
18
*/
19
val uzunGirintiliMetin = """if(a > 1) {
20
| return a
21
|}""".trimMargin()
22
23
var func: () -> Unit = {
24
// Kardeş ben fonksiyonum
25
}
26
27
var func2: (Boolean) -> Unit = { bool ->
28
// Kardeş ben parametreli fonksiyonum
29
}
30
31
var func2: (Boolean) -> Int = { bool ->
32
// Kardeş ben bir integer döndürüyorum
33
return 1
34
}
35
36
companion object {
37
var metin = "yemreak" // static String metin = "yemreak"
38
var metin: String = "yemreak" // static String metin = "yemraek"
39
val metin = "değişmem" // static final String metin = "değişmem"
40
}
41
42
lateinit var sonrakiMetin
43
// ...
44
sonrakiMetin = "yok"
45
46
// 0 sa true değilse false
47
val isEmpty: Boolean get() = size == 0
Copied!

🐥 Nullable Objeler

  • ✨ Java'daki NullPointerException hatalarına odaklı bir çalışmadır
  • 🌌 Objeler null olabilir veya null olamaz şeklinde oluşturulur
  • 💁‍♂️ Default olarak null olamaz olarak atanır
1
var metin: String = "selam" // var metin = "selam" ile aynıdır
2
var metin: String? = null
3
metin?. // Varsa kullan
4
metin!! // Olduğundan kesinlikle eminim
5
6
var func: (() -> Unit)? = null
7
func?.invoke() // Null değilse çalıştır
8
9
// Dsoya varsa sayısı yoksa boş yaz
10
println(files?.size ?: "empty")
11
12
// Hata fırlatmalı atamalar
13
val email = values["email"] ?: throw IllegalStateException("Email is missing!")
Copied!

🍎 Veri Sınıfları

  • 📈 Kotlin class veya data class yapısı ile get ve set kullanımı gerekmez
  • 🙄 Java ile resmin solundaki yapı gereklidir

🐣 Get Set Kullanımı

  • 🌌 Get set olmadan direkt olarak kullanabilirsiniz
  • ‍🧙‍♂ Kotlin, onu sizin için halletmekte
1
val arrayAdapter = ArrayAdapter<String>(
2
wifiDirectActivity,
3
R.layout.activity_wifi_direct,
4
deviceNameList
5
)
6
wifiDirectActivity.lvPeer.adapter = arrayAdapter
Copied!

👮‍♂️ Switch - Case

  • 🤝 Koşullu değer atama işlemlerini destekler
  • 📈 Sıradan switch yapısına göre daha verimlidir
1
val reasonMsg = when (reason) {
2
WifiP2pManager.P2P_UNSUPPORTED -> "P2P desteklenmiyor"
3
WifiP2pManager.ERROR -> "hata oluştur"
4
WifiP2pManager.BUSY -> "cihaz başka bir bağlantı ile meşgul"
5
else -> ""
6
}
Copied!

💁‍♂️ Functional Arguments

  • 💦 Gereksiz yere parantez ( kullanımı yoktur
  • ⚙️ Bu yapı ile otomatik olarak son fonksiyona tanımlanan işlemler atanır
1
button.setOnClickListener { view ->
2
// ...
3
}
4
5
/*
6
// Java kullanımı
7
button.setOnClickListener ( { view ->
8
9
});
10
*/
11
12
fun funcT(func1: () -> Unit, func2 () -> Unit) { }
13
14
funcT({ /* func1 */ }) {
15
// func2
16
}
Copied!
📢 Functional argument olursa, sadece metot {} kullanılması durumunda sadece son argümana değer atanır

➕ Function Extension

  • 💁‍♂️ Tanımlı olan sınıflara . operatörü ile metotlar ekleyebilirsiniz
  • 👇 Alttaki örnekte Uri sınıfına getInputStream metodu ekliyoruz
📢 Uri sınıfı temel java sınıflarından birisidir
🚀 Android Kotlin Extension'ları Android KTX paketi altındadır

🔪 Dizileri Parçalama

  • 🎯 Range metodu kullanılarak diziler parçalanabilmekte
  • 🐥 Çok kolay kullanımı vardır
🐍 Python dizi parçalama işlemlerine benzemektedir
1
val byteArray = ByteArray()
2
val slicedByteArray: List<Byte> = BUFFER.slice(3..5)
3
4
val bas = 10
5
val son = 100
6
val slicedByteArray2: List<Byte> = BUFFER.slice(bas..son)
Copied!

💱 Dizileri Dönüştürme

  • 🚀 toTypedArrayeklentisi ile direkt olarak List'i argümana çevirebilirsiniz
📈 Java'dan çok daha verimli
1
val quakes: List<Quake>
2
val args: Array<out Quake> = quakes.toTypedArray()
3
4
/* Java
5
List<String> yourList = List.of("hello", "world");
6
yourVarargMethod(yourList.toArray(new String[0]));
7
*/
Copied!
‍🧙‍♂ Detaylı bilgi için Fonksiyonlar alanına bakabilirsin.

💎 Keyword Argument

  • ✨ Değişkenlerin adları ile onlara değer atayabilirsin
  • ⭐ Python gibi dillerde olan bir kullanımdır
1
hasWifiDirectPermission(activity = activity)
2
3
fun hasWifiDirectPermission(activity: Activity): Boolean {
4
return hasPermission(
5
activity,
6
Manifest.permission.ACCESS_FINE_LOCATION
7
)
8
}
Copied!
📢 Functional argument olursa, sadece metot {} kullanılması durumunda sadece son argümana değer atanır

💠 Parametre Olarak Fonksiyon

  • 💁‍♂️ Fonksiyonlar obje ise parametre olarak da kullanılabilir
  • 💡 Tanımlama şekli ile parametre olarak verilebilir
1
fun func(inFunc: (ByteArray) -> Unit) {
2
// ...
3
inFunc()
4
}
5
6
// Func kullanımı
7
func {
8
// inFunc içeriği
9
]
10
11
var func2 = { byteArray -> /* ... */ }
12
func(func2)
13
Copied!

👨‍💼 Run - Apply - Let - Also

  • 👪 Bir değişkenin birden fazla metodunu kullanmayı sağar
  • 🐣 Apply objelerine değer atarsınız
  • ▶️ Run ile alt metotlarını kullanırsın, sonucunu döndürürsünüz
  • 🙋‍♂️ Let ile objeyi koşullu kullanabilirsin
  • 💁‍♂️ Also ile "işlemi bitirmeden bir de bunu yap" deriz
  • 📈 Tekrar tekrar yazmayı engeller
1
val wifiFilter = IntentFilter().apply {
2
addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
3
addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
4
}
5
6
obje.run {
7
metot2() // obje.metot2()
8
metot3() // obje.metot3() Döndürülür
9
}
10
11
obje?.let { // Koşullu kullanım
12
it.metot2() // obje.metot2()
13
it.metot3() // obje.metot3()
14
}
15
16
channel?.also { channel ->
17
wifiReceiver = WifiDirectBroadcastReceiver(manager, channel, this)
18
}
19
20
// Yer değiştirme
21
a = b.also { b = a }
Copied!
‍🧙‍♂ Detaylı bilgi için Scope Function ve Function Selections alanlarına bakabilirsin.

👀 Dokümantasyon Linkleri

  • 👇 Metotların üzerine geldiğinizde (hover) açıklamasında doküman linki olur
  • ⭐ Link üzerinden kullanım örneklerine erişirsiniz

📃 XML ID'lerini Koda Import Etme

  • 🔗 Kotlin otomatik olarak xml idlerini projeye dahil eder
  • 👨‍💻 import kotlinx.android.synthetic.main.<layour>.* ile dahil edilir
  • 💦 findViewByID metoduna gerek yoktur

👮‍♂️ İzinlerin Kontrolü

  • 📢 İzin tanımlanmadığında hata verir
  • 💁‍♂️ @SupressLint("MissingPermission") ile bunu engelleyebilirsiniz
  • 🤭 "Ne yaptığımın farkındayım, bana bulaşma" demek gibi

🚧 Coroutine

  • 🕊️ Thread işlemlerini kolaylaştıran bir hafif yapıdır
  • 👷‍♂️ Coroutine ile inline thread kullanabilirsin
  • 👮‍♂️ Main (UI), IO, Default thread yapıları ile arka plan işlemlerini yönetirsiniz
  • ✨ Otomatik olarak optimize edilirler
🧱 Dispatchers.Main
🔣 Dispatchers.IO
🎳 Dispatchers.Default
UI Thread işlemleri
Disk ve network işlemleri
CPU gerektiren işlemler
Fonksiyon çağırma
Database
Liste sıralama
View işlemleri
Dosya okuma & yazma
JSON parsing
LiveData işlemleri
Ağ işlemleri
DiffUtils
‍🧙‍♂ Detaylı bilgi için Coroutine alanına bakabilirsin.

🗃️ RoomDB Coroutine Scope

  • 👮‍♂️ suspend anahtar kelimesi ile thread gerektiren metotlar belirlenir
  • ❌ Thread gerektiren metotlar UI Thread üzerinde çalıştırılamaz
  • 🌌 Coroutine scope içerisinde kendilerine özgü thread ile çalıştırılır
  • 👋 AsyncTask'a elveda (zaten sevmedim 🙄)
ViewModel
1
fun refreshQuakes(quakes: List<Quake>) = viewModelScope.launch {
2
repository.deleteAll() // Dao üzerinden suspend metottur
3
repository.insert(quakes.toTypedArray())
4
}
5
6
/*
7
@Dao
8
abstract class QuakeDao {
9
10
@Query("DELETE FROM ${Quake.TABLE_NAME}")
11
abstract suspend fun deleteAll() // Burada suspend ile thread istiyoruz
12
13
}
14
*/
Copied!
‍🧙‍♂ Detaylı bilgi için RoomDB - Android sayfasına bakabilirsin.

🔗 Faydalı Kaynaklar

🧐 Daha Fazla

Kotlin Notlarım
Kotlin ~ YEmreAk
🚀 Kotlin’in Java’ya Göre Avantajları
Medium
GitHub - MindorksOpenSource/from-java-to-kotlin: From Java To Kotlin - Your Cheat Sheet For Java To Kotlin
GitHub