Class dan Object pada Kotlin

Muhammad Fajri
Wednesday, 14 April 2021

Bismillahirrahmanirrahim.

Kotlin merupakan salah satu bahasa Object Oriented Programming (OOP) atau pemrograman berorientasi objek. Ada beberapa istilah yang perlu dimengerti dalam OOP yaitu Object dan Class.

Object adalah data yang berisi properties (field atau attribute) dan function (method atau behavior). Semua data di Kotlin adalah object (Number, Boolean, Character, String dan yang lainnya).

Class adalah blueprint, prototype atay cetakan untuk membuat Object. Class berisikan deklarasi semua propertie dan function yang dimiliki oleh Object. Setiap Object selalu dibuat dari Class dan semua Class bisa membuat Object tanpa batas.

Class didefinisikan menggunakan kata kunci class, sebuah identifier (sebagai nama Class), header (opsional), dan body(opsional). Membuat class di Kotlin tidak ada aturan penamaan class harus sama dengan nama filenya seperti di Java. Namun agar kodenya rapih dan mudah dimengerti, disarankan untuk membuat nama class dan nama file yang sama. Misalnya class Person dengan file Person.kt.

Pembuatan Class

Contoh pembuatan class:

class Person() {
}

Untuk membuat instance dari class tersebut, kita tuliskan:

var person = Person()

Header merupakan pasangan tanda kurung (()) yang dapat berisi parameter. Tanda kurung kurawal ({}) merupakan body dari class. Keduanya bersifat opsional.

Untuk membuat instance (membuat Object) dari sebuah class, kita buat seperti pembuatan variabel biasa namun diinisialisasi seperti memanggil function yaitu dengan menggunakan nama class (Person()). Di Kotlin, kita tidak membutuhkan kata kunci khusus untuk membuat Object, tidak seperti di Java di mana kita harus menyertakan kata kunci new untuk membuat Object/ instance sebuah class.

Perhatikan kembali pembuatan class di atas (class Person() {...}). Di Kotlin, kita dapat membuat header. Tidak seperti di Java dimana ia tidak memiliki header. Header ini sebenarnya merupakan definisi sebuah constructor.

Pembuatan Constructor

Class di Kotlin dapat memiliki lebih dari satu buah constructor dalam definisinya. Terdapat dua jenis constructor yaitu primary yang dibuat di bagian header dan secondary yang dibuat di dalam body dari class.

Contoh pembuatan constructor:

class Person constructor(_name: String) {
    var name: String
    init {
        name = _name
    }
}

Pembuatan class seperti contoh di atas, sebenarnya sama dengan pembuatan class sebelumnya. Hanya saja di contoh class yang kedua ini, terdapat kata kunci constructor dimana ia memuat sebuah parameter. var name: String merupakan variabel member yang akan menampung nilai dari _name. init {...} merupakan blok initializer, sama seperti di Java. Blok ini akan dieksekusi ketika membuat instance dari class. Initializer ini dapat dibuat lebih dari satu, dan eksekusinya sesuai dengan urutan pembuatannya. Initializer dibuat dengan menggunakan kata kunci init. Kita akan menggunakannya jika kita hanya memiliki primary constructor, karena primary constructor tidak dapat memuat kode apapun (statement atau pun expression). name: _name kita dapat mengakses argument yang diteruskan ke nilai primary constructor dari blok initializer.

Jika primary constructor tidak memerlukan annotation atau visibility modifier, kita dapat menghilangkan kata kunci constructor menjadi seperti:

class Person(_name: String) {
    var name: String
    init {
        name = _name
    }
}

Kita bahkan dapat menyederhanakan penulisannya dengan menggabung blok init dan deklarasi nama variabel dalam sebuah statement. Kotlin sepintar itu.

class Person(_name: String) {
    var name: String = _name
}

Berikutnya, untuk membuat secondary constructor dimana ia dibuat di dalam body dari class.

class Person {
    var name: String
    constructor(_name: String) {
        name = _name
    }
}

Membuat constructor di dalam body dari class, kita tidak memerlukan blok init karena inisialisasi nama variabel member diselesaikan di dalam blok constructor.

Contoh lain pembuatan constructor:

class Employee {
    var name: String = ""
    var empid: String = ""
    constructor(_name: String) : this(_empid, "1001")
    constructor(_name: String, _empid: String) {
        name = _name
        empid = _empid
    }
}

Dari kode di atas, kita harus menginisialisasi variabel member. Secondary constructor membutuhkan kata kunci constructor.

Kita dapat melakukan overload pada constructor di Kotlin sama seperti di Java. Kita pun dapat memanggil constructor yang lain menggunakan kata kunci this. Kata kunci ini, sama seperti di Java, mengacu pada sebuah instance yang dibuat. Kita harus merangkai pemanggilan this pada definisi constructor menggunakan titik dua (:).

Kotlin memungkinkan kita untuk melakukan parametric polymorphism pada constructor melalui overloading. Ini bukanlah model Kotlin yang sebenarnya, karena Kotlin memiliki kemampuan untuk menyediakan nilai default untuk parameter function. Penulisan class di atas dapat disederhanakan menjadi:

class Employee (_name: String, _empid, "1001") {
    val name = _name
    val empid = _empid
}

Penulisan class ini menjadi lebih pendek dan ringkas. Selanjutnya, dengan memindahkan parameter constructor ke primary constructor, ini memungkinkan kita untuk mendeklarasikan variabel member menggunakan val daripada var. Menggunakan variabel immutable lebih dianjurkan di Kotlin karena ini dapat mengurangi error pada kode yang dibuat. Kita tidak dapat mengubah nilai properti menjadi immutable pada posisi yang pertama.

Inheritance

Class Kotlin secara default adalah final, berlawanan dengan Java yaitu non-final (terbuka).

Agar dapat membuat inheritance pada class Kotlin, kita harus membuatnya menjadi non-final. Untuk itu, kita perlu menambahkan kata kunci open agar modifier pada class menjadi atau bersifat non-final (terbuka).

Contoh kodenya:

open class Person {
}
class Employee : Person() {
}

Perilaku final secara default tidak hanya pada class, member function pun seperti itu di Kotlin. Jadi, saat member function tidak diberikan kata kunci open maka ia bersifat final.

Berikut contoh pembuatan class yang memiliki function bersifat non-final sehingga dapat dibuatkan inheritance melalui proses overriding.

open class Person(_name: String) {
    val name = _name

    open fun talk() {
        println("${this.javaClass.simpleName} talking")
    }
}

class Employee(_name: String, _empid: String = "1001") : Person(_name) {
    val empid = _empid

    override fun talk() {
        super.talk()
        println("Hello")
    }

    override fun toString(): String {
        return "name: $name | id: $empid"
    }
}

fun main() {
    var empA = Employee("Lamaddu", "1002")
    var empB = Employee("Lasinring", "1003")

    println(empA.talk())
    println(empA.toString())
    println(empB.talk())
    println(empB.toString())
}

open fun talk(), funtion ini dibuat non-final dengan menambahkan kata kunci open agar dapat di-override. override fun talk(), function baru yang telah bersifat non-final sekarang dapat dibuat kembali pada class yang baru dengan menambahkan kata kunci override. super.talk(), kita dapat memanggil super behavior dari sini, ini efektif untuk memanggil function talk() yang ada di class Person. toString(), perilaku ini di-inherit dari class Person.

Output:

Employee talking
Hello
kotlin.Unit
name: Lamaddu | id: 1002
Employee talking
Hello
kotlin.Unit
name: Lasinring | id: 1003

Perhatikan kembali program di atas. Pada program tersebut dibuat dua buah class satu sebagai class induk yaitu class Person yang mendefinisikan variabel _name dan sebuah function talk(), dan class anak dengan nama Employee yang mendefinisikan _name dan _empid diman class ini meng-inherit class Person tadi. Di class Employee meng-override function talk() class Person dan mengambil nilai behavior-nya dengan menggunakan super.talk() dan di function talk() yang baru ini pun dibuat sebuah output baru (Hello). Dan terakhir dibuatkan function yang lain yaitu toString() untuk mencetak nilai name dan empid.

Pada function main(), di sana saya buatkan dua buah object baru dengan nama empA dan empB kemudian masing-masing saya definisikan nilai _name dan _empid-nya. Pada output saya coba mencetak function talk() di masing-masing object yang membawa nilai behavior (termasuk behavior dari super class) dan function toString() yang membawa nilai attribute.

Referensi

  1. Modul Pemrograman Mobile (Mobile Programming).
  2. Hagos, Ted. 2018. Learn Android Studio 3 with Kotlin: Efficient Android App Development. Apress: Manila.