Kotlin OOP Part 2

This image has an empty alt attribute; its file name is image.jpeg

            Selamat datang kembali di blog idn. Sebelumnya kita telah belajar tentang kotlin object oriented programming, kotlin multiparadigma, class, constructor, property dan method. Jadi sebelum lanjut membaca artikel ini disarankan untuk membaca artikel kotlin object oriented programming sebelumnya dan disini saya akan membahas secara singkat saja.

            Class merupakan sebuah template kode program yang digunakan untuk membuat sebuah objek, menginisialisasi nilai untuk state atau keadaan, dan mengimplementasi dari behavior atau perilaku dalam class tersebut.

Sedangkan property merupakan bagian dari class yang merupakan klasifikasi yang dimiliki objek tersebut. Dalam property memiliki fungsi setter dan getter. Fungsi setter digunakan untuk memodifikasi nilai property yang akan diset atau diatur kedalam property tersebut. Sedangkan untuk fungsi getter digunakan untuk memodifikasi nilai ketika property tersebut diambil. Ketersediaan fungsi setter hanya ada pada property yang dideklarasi dengan keyword var.

            Constructor adalah sebuah struktur dari object oriented programming yang diinialisasi untuk membuat dan membantu objek baru sehingga tiap instance yang kita buat memiliki nilai masing-masing.

Sedangkan method atau behavior merupakan bagian dari class yang berisi sebuah action atau aksi yang ada didalam class. Secara singkat method atau behavior merupakan sebuah fungsi yang berada didalam class.

            Kali ini kita akan belajar mengenai Kotlin OOP lebih dalam lagi. Pada pembahasan ini kita akan membahas tentang property delegation, extension class, secondary constructor dan default value constructor. Jadi persiapkan diri kalian dan kita mulai dari property delegation.

            Untuk meminimalisir kode boilerplate seperti penggunaan setter dan getter pada property, kita bisa menggunakan yang namanya Property Delegation atau teknik delegate pada kotlin. Contohnya saja kita punya dua class yang masing-masing class tersebut memiliki property dengan tipe data yang sama dan memiliki isi fungsi setter dan getter yang sama. Daripada kita menulis fungsi setter dan getter di masing-masing class, lebih baiknya kita menggunakan teknik delegate. Jadi kita hanya membuat fungsi setter dan getter pada class delegate dan menggunakan nya pada kedua property class diatas. Langkah pertama hal yang harus dilakukan adalah membuat class delegate dahulu.

import kotlin.reflect.KProperty 
class Delegate {
    private var value:String = “”
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return “delegating ${property.name} to $thisRef”
    }
     operator fun setValue(thisRef: Any?, property: KProperty<*>,
newValue: String) {
        println(“$newValue assigned to ‘${property.name}’ in
$thisRef.”)
        value = newValue
    }
}  

Kode diatas merupakan contoh deklarasi class delegate. Didalamnya berisi method getValue yang berfungsi sama seperti getter dan method setValue yang berfungsi sama seperti setter. Setelah itu kita akan membuat 2 buah class yang property nya akan didelegate.

class Person {
    var personName by Delegate()

class Food {
    var foodName by Delegate()
}  

            Untuk mendelegasikan property yang ada didalam class , kita gunakan keyword by dengan diikuti class delegatenya. Jadi sekarang untuk property dari class diatas fungsi setter dan getternya sudah dihandle oleh class delegate. Selanjutnya kita coba akses kedua class diatas.

fun main() {
    val person = Person()
    val food = Food()

     person.personName = “Ihsan”
    food.foodName = “Coca-Cola”

     println(person.personName)
    println(food.foodName)
     /**
     * Result
     * Ihsan assigned to ‘personName’ in Person@31befd9f.
     * Coca-Cola assigned to ‘foodName’ in Food@1c20c684.
     * delegating personName to Person@31befd9f
     * delegating foodName to Food@1c20c684
     * */}  

            Jika dilihat dari hasil log nya, fungsi setValuenya atau fungsi setternya yang berjalan dahulu. Mengapa demikian? Karena sebelum ditampilkan di log kita terlebih dahulu meassign value ke property class nya dan diikuti dengan fungsi getternya. Lalu bagaimana jika ingin membuat delegate tetapi dengan property yang berbeda tipe data? Jawabannya adalah kita akan menggunakan delegate generic. Generic adalah fitur yang memungkinkan kita untuk mendefinisikan class, method, dan property yang dapat diakses menggunakan tipe data yang berbeda. Untuk pembahasan generic lebih dalam, kita akan bahas di artikel berikutnya.

            Dalam kotlin, kita bisa mengextends property dan function pada class. Proses mengextends property dan function dinamakan Extension. Secara singkat teknik extension adalah bagaimana menyediakan fungsi setter and getter secara explisit. Dengan teknik extension, kita bisa menambah fungsionalitas baru tanpa harus mewarisi dari classnya. Dengan artian kita tidak perlu meng-harcode property atau function baru pada sumber file asli classnya. Akan tetapi property atau function yang diextends tidak benar-benar ada didalam classnya dikarenakan proses extends terjadi diluar class tersebut.

class Person(val firstName:String = “Joe”) 

val Person.lastName:String
    get() = “Mama” 

fun Person.getName():String {
    return “Hi My name is ${this.firstName} ${this.lastName}”

fun main(){
    val person = Person()
    val getNamePerson = person.getName()
    println(getNamePerson)
     // result –> Hi My name is Joe Mama 
}  

            Kode diatas merupakan cara untuk meng-extends sebuah property dan method pada class. Untuk mengextends sebuah property pada class sama saja kita seperti mendeklarasikan variable. Setelah itu diikuti dengan nama classnya dan nama propertinya beserta tipe datanya. Perlu diingat saat mengextends sebuah property harus menyertakan fungsi setter dan getternya sesuai keyword pendeklarasian nya yaitu keyword val atau var. Bedanya disini jika kita menggunakan keyword val maka kita hanya bisa menggunakan getternya sedangkan untuk keyword var kita bisa menggunakan fungsi setter dan getternya.

Apabila tidak menyertakan fungsi diatas maka proses extends akan terjadi error. Untuk proses extends function juga sama saja seperti pendeklarasian fungsi.

            Kotlin memiliki memiliki 2 jenis constructor, yang pertama adalah primary constructor dan yang kedua adalah secondary constructor. Untuk primary constructor sebenarnya kita sudah membuatnya pada artikel kotlin object oriented programming sebelumnya. Primary constructor merupakan cara pendeklarasian constructor seperti biasa. Lalu bagaimana cara kerja dari secondary constructor?

            Penggunaan secondary constructor umumnya ketika kita ingin memperluas kelas yang menyediakan banyak constructor  yang menginisialisasi kelas dengan cara yang berbeda. Perbedaan paling signifikan antara primary constructor dan secondary constructor adalah dalam class hanya dapat membuat satu primary constructor sedangkan untuk secondary constructor dapat dibuat lebih dari satu dalam class.

class Car(name:String,type:String){
    var carName:String
    var carType:String
    var isMatic:Boolean
    init {
        this.carName = name
        this.carType = type
        this.isMatic = false
    }
     constructor(name:String,type: String,isMatic:Boolean):
this(name,type){
        this.isMatic = isMatic
    } 
}  

            Mungkin dari anda ada yang bertanya apa fungsi dari keyword init itu? Keyword init berfungsi untuk mengeksekusi code yang beada discopenya, baik untuk menginisailisasi property dalam class, membantu memvalidasi nilai property sebelum diinisialisasi dan sebagainya. Dalam kode diatas init berfungsi sebagai inisialisasi property. Maka dari itu ketika pendeklarasian property di atas tidak langsung memasukan atau meassign value pada property. Apabila block init dihapus maka pendeklarasian property menjadi error.

            Penulisan secondary constructor ditandai dengan keyword constructor dan diikuti dengan property constructornya. Jangan lupa untuk mengextends primary constructor beserta dengan property constructor. Untuk primary constructor hanya memiliki property constructor name dan type. Sedangkan untuk secondary constructor memiliki satu tambahan property constructor yaitu isMatic. Mari kita lihat cara pemanggilannya.

fun main(){
    val car1 = Car(“Misthubishi”,”Evo 9″)
    val car2 = Car(“Porshce”,”911 GT3″,true
}

Untuk instance car1 kita hanya memasukan argument sesuai dengan primary constructor dan untuk instance car2 menggunakan secondary constructor. Jadi ketika kita membuat instance dari class Car dan memasukan argument dari isMatic maka anda menggunakan secondary constructor.

            Sebagai tambahan saja, pada primary constructor kita bisa membuat default value untuk propertinya, sehingga ketika ketika membuat instance kita tidak perlu memasukan argument nya. Akan tetapi jika kita isi argument nya maka nilai dari propertinya  adalah argument yang kita assign.

class Person(val name:String = “Joe”) 
fun main(){
    val person = Person()
    val person2 = Person(“Alfred”)

     println(person.name)
    println(person2.name)
        /**
     * result -> Joe
     * result -> Alfred
    */}

Sekian untuk pembahasan mengenai kotlin Object Oriented Programing part 2 kali ini. Tentunya kita akan lanjut ke part 3 nya untuk mempelajari lebih dalam lagi. Oleh karna itu tetep nantikan artikel pada blog IDN selanjutnya.

Tertarik mengikuti training kotlin di IDN.ID? Cek disini. Selain training kotlin, kami juga menyediakan berbagai pilihan training klik disini untuk informasi lebih lengkapnya.

Penulis : Exfar Nanda Micola