✨ Constructor Kotlin

✨ Constructor Kotlin


Photo by Filip Kominik on Unsplash

Hallo sob. Masih seputar Kotlin ya, kali ini ane pengen bahas tentang Class di Kotlin. Layaknya Java, Kotlin juga punya class. Lalu perbedaannya apa sih?

Class di Kotlin di deklarasikan menggunakan keyword “class”. Sama aja sih ya kaya Java. Deklarasi class ini terdiri dari nama class-nya, header-nya (ada parameter-parameternya, constructor utama dan yang lainnya) dan body-nya yang biasanya tuh di bungkus sama kurung kurawal ({}).

class Example

Cosntructor

Sebuah class di Kotlin bisa memiliki satu constructor utama dan satu atau lebih constructor lainnya. Constructor utama merupakan bagian dari header class, setelah nama class sob. Kita bisa nambahin parameter-parameter juga di constructor utama ini.

Nah untuk inisialisasi variable dari constructor utama, Kotlin sendiri punya syntax yang ringkas, yaitu val dan var. val ini kita gunakan untuk property yang hanya bisa kita baca value-nya atau read-only. Sedangkan var, value-nya itu bisa kita ubah-ubah sob.

Kita juga bisa ngilangin si tulisan constructor kalo misal parameter-parameternya itu gak ada yang pake access modifier dan atau anotasi.

class Example(val type: String) {
  // Hello Example
}

Constructor utama tidak boleh berisi kode apapun. Untuk inisialisasi, kita bisa pake initializer block ya, yang pake keyword init itu loh sob.

class InitOrderDemo(name: String) {
  val firstProperty = "First property: $name".also(::println)
    
  init {
    println("First initializer block that prints ${name}")
  }
  
  val secondProperty = "Second property: ${name.length}".also(::println)
    
  init {
    println("Second initializer block that prints ${name.length}")
  }
}

fun main() {
  InitOrderDemo("hello")
}

Selain constructor utama, kita juga bisa membuat secondary constructor yang diawali dengan constructor.

import java.util.Arrays

class KotlinSecondaryConstructor {
  constructor(name: String) {
    println("This is Secondary Constructor, passed parameter is $name")
  }
}

fun main(args: Array) {
  KotlinSecondaryConstructor("Kursi Goyang")
}

Kalo di dalam class udah ada primary constructor-nya dan kita pengen nih buat secondary constructor, kita perlu mendelegasikan primary constructor-nya terlebih dahulu di secondary constructor. Delegasi ke constructor lain itu sangat sederhana sekali, cukup menggunakan keyword this.

import java.util.Arrays

class KotlinSecondaryConstructor(name: String) {
    
    init {
        println("This is Primary Constructor, passed parameter is $name")
    }
    
    constructor(name: String, age: Int): this(name) {
        println("This is Secondary Constructor, passed parameter is $name and $age")
    }
}

fun main(args: Array) {
    KotlinSecondaryConstructor("Kursi Goyang Doang")
    KotlinSecondaryConstructor("Kursi Goyang", 2)
}

Perlu di catet nih sob, kalo initializer itu bisa dibilang merupakan bagian dari constructor utama. Delegasi dari constructor utama itu terjadi barengan sama eksekusi secondary constructor sob. Jadi semua kode yang ada di initializer itu bakal di eksekusi sebelum delegasi/secondary constructor yg kita buat. Bahkan kalo kondisinya itu si class ga punya constructor utama, si initializer ini bakal dieksekusi sebelum secondary constructor.

Lalu, kalo class non-abstract gak punya constructor samsek, baik itu primary maupun secondary, ia bakal meng-generate primary constructor kosong, yang tanpa argument, dan visibility-nya itu bakal public sob. So, kalo sobat pengen buat visibility-nya gak public, ya tinggal kita tambahin constructor kosong sebagai constructor utamanya.

import java.util.Arrays

class PublicVisibility constructor() {
  init {
    println("Empty constructor")
  }
}

class PrivateVisibility private constructor() {
  init {
    println("Empty constructor private")
  }
}

fun main(args: Array) {
  PublicVisibility()
    
  // [Error] Cannot access '': it is private in 'PrivateVisibility'
  PrivateVisibility()
}

Note:
Sebuah hal yang menurut ane keren di Kotlin itu adalah default value. Kita bisa passing default value di parameter sob. Kita ambil case-nya itu parameter constructor. Kerennya kalo misal kita gak nge-passing value ke instance class-nya, si JVM bakal ngambil default value yang kita set sebelumnya.

import java.util.Arrays

class DefaultValue(val name: String = "Kursi Goyang") {
  init {
    println(name)
  }
}

fun main(args: Array) {
  DefaultValue()
}

Instansiasi Class

Kalo di java kita banyak nulis new, new dan new, di kotlin kita tinggal panggil constructornya aja sob, tanpa new, new dan new.

import java.util.Arrays

class DefaultValue() {
  fun print(text: String) {
    println(text)
  }
}

fun main(args: Array) {
  // Instansiasi class DefaultValue
  val dv = DefaultValue()
  dv.print("Coba dong")
}

Perlu di catat nih ya, Kotlin gak punya keyword yang namanya new, so buat instansiasi, ya tinggal panggil aja constructornya tanpa new.

Yo, segitu dulu aja ya kalo ada yg belum di pahami boleh kok simpen di komentar, kita diskusi bareng ya. Salam sigoy!
✨ Inheritance Kotlin

✨ Inheritance Kotlin


Photo by Philipp Berndt on Unsplash

Kali ini ane ingin share tentang Inheritance atau Pewarisan di Kotlin. Sama halnya dengan pewarisan yang ada pada Bahasa Java, Inheritance berarti mengakuisisi/memperoleh property-properti yang ada pada parent class ke child class.

Pada Bahasa Kotlin, base class-nya dinamai “Any”, yang merupakan super class dari class apapun yang di deklarasikan di Kotlin. Secara default, Kotlin memiliki superclass “Any”, yang merupakan superclass default untuk class yang tidak di deklarasikan dengan supertypes. Contohnya

class Example

Sebenarnya, class-class Kotlin itu final, alias gak bisa di inherit-in. Untuk bisa kita inherit-in itu, kita cukup tandain aja pake keyword open. Untuk mendeklarasikan supertype nya apa, kita cukup menggunakan titik dua di header class.

import java.util.Arrays

open class Parent() {
  fun printParent() {
    print("This is from Parent")
  }
}

class Child() : Parent() {
    
}

fun main(args: Array) {
  val a = Child()
  a.printParent()
}

Nah, sekarang bagaimana sih cara untuk meng-override method printParent di child? Sederhana sih sob, berikut contohnya:

import java.util.Arrays

open class Parent() {
  open fun printParent() {
    print("This is from Parent")
  }
}

class Child() : Parent() {
  override fun printParent() {
    print("This is from Child")
  }
}

fun main(args: Array) {
  val a = Child()
  a.printParent()
}