Deklarasi kelas pada Scala menempatkan constructor utama, field, dan metode dalam satu kesatuan yang ringkas. Topik ini membahas cara parameter kelas menjadi field, cara metode instansi dideklarasikan, serta daftar parameter dengan nilai default dan argumen bernama. Setelah topik ini dibaca, deklarasi kelas beserta pemanggilannya dapat ditulis dan dibaca dengan pemahaman atas fungsi setiap bagiannya.
Constructor utama dan field#
Constructor utama (primary constructor) ditulis langsung pada kepala deklarasi kelas, yaitu daftar parameter yang berada tepat setelah nama kelas. Setiap parameter yang diberi val atau var otomatis menjadi field, sehingga tidak ada deklarasi field terpisah seperti pada banyak bahasa lain. Parameter tanpa kedua kata kunci itu tetap dapat dibaca metode di dalam kelas, tetapi compiler memperlakukannya sebagai anggota privat, bukan bagian antarmuka kelas. Penambahan kata private pada var membatasi perubahan keadaannya hanya dari dalam kelas tempat field itu berada.
Program berikut mendeklarasikan kelas Book untuk katalog dan sirkulasi perpustakaan. Simpan sebagai book.scala.
// Kelas Book untuk katalog dan sirkulasi perpustakaan
class Book(val title: String, val author: String, private var stock: Int):
// metode instansi yang menyusun deskripsi singkat
def describe(): String =
s"$title karya $author, stok $stock"
// metode dengan parameter default yang mengubah stok
def lend(quantity: Int = 1): Boolean =
if quantity <= stock then
stock = stock - quantity
true
else
false
end Book
@main def library(): Unit =
val book = Book("Algoritma Dasar", "Citra Dewi", 3)
println(book.describe())
println(book.lend())
println(book.lend(5))
println(book.describe())Jalankan program tersebut dengan scala-cli.
# mengompilasi dan menjalankan program book.scala
scala-cli run book.scalaAlgoritma Dasar karya Citra Dewi, stok 3
true
false
Algoritma Dasar karya Citra Dewi, stok 2Parameter title dan author diberi val, sehingga keduanya menjadi field String yang terbaca dari luar kelas. Parameter stock diberi private var, sehingga nilainya dapat diubah oleh metode di dalam kelas Book tetapi tersembunyi dari pengguna kelas. Instance dibuat tanpa kata new karena compiler menyediakan metode apply pada companion object yang mengarah ke constructor utama, sehingga Book("Algoritma Dasar", "Citra Dewi", 3) langsung menghasilkan instance. Mekanisme apply ini dibahas lebih rinci pada topik Objek dan companion.
Metode dan parameter default#
Metode instansi dideklarasikan dengan def di dalam tubuh kelas dan memiliki akses penuh ke seluruh field, termasuk yang private. Tipe kembalian pada describe dan lend tidak ditulis karena compiler menentukannya dari tubuh metode, dan anotasi tipe tetap dapat ditambahkan pada metode yang digunakan lintas modul. Hasil kembalian berupa nilai terakhir dari tubuh metode, sehingga lend mengembalikan true atau false menurut cabang if yang dijalankan.
Parameter quantity pada lend memiliki nilai default satu, ditulis quantity: Int = 1. Pemanggilan tanpa argumen, book.lend(), menggunakan nilai default tersebut, sedangkan book.lend(5) mengirim nilai eksplisit. Nilai default dievaluasi pada setiap pemanggilan, sehingga ekspresi apa pun yang sah sebagai argumen juga sah sebagai nilai default.
Keluaran pada bagian sebelumnya mengikuti urutan peristiwa program secara tepat. Stok awal tiga terbaca pada baris pertama, peminjaman satu buku berhasil dan mengembalikan true, permintaan lima buku ditolak karena melebihi stok sehingga lend(5) mengembalikan false, dan baris terakhir memperlihatkan stok tersisa dua. Peminjaman yang ditolak tidak mengubah keadaan sama sekali karena pengurangan stok hanya dilakukan di dalam cabang yang lolos pemeriksaan.
Daftar parameter dan argumen bernama#
Daftar parameter kelas dapat menerima nilai default pada sebagian parameternya, seperti days: Int = 7 dan note: String = "tanpa catatan" pada kelas Loan berikut. Pemanggil yang hanya mengirim argumen pada posisi awal memperoleh nilai default untuk sisanya. Simpan program berikut sebagai loan-card.scala.
// Pencatatan peminjaman buku di meja layanan perpustakaan
class Loan(
val bookTitle: String,
val memberName: String,
val days: Int = 7,
val note: String = "tanpa catatan"
):
// seluruh parameter menjadi field dan dipakai metode di bawahnya
def summary(): String =
s"$bookTitle dipinjam $memberName selama $days hari ($note)"
end Loan
@main def loanDesk(): Unit =
// argumen mengikuti urutan deklarasi, dua parameter terakhir memakai default
val l1 = Loan("Struktur Data", "Budi Santoso")
// parameter bernama: urutan bebas dan setiap nilai langsung terbaca
val l2 = Loan(
note = "praktikum akhir",
days = 14,
bookTitle = "Jaringan Komputer",
memberName = "Dewi Lestari"
)
println(l1.summary())
println(l2.summary())# mengompilasi dan menjalankan program loan-card.scala
scala-cli run loan-card.scalaStruktur Data dipinjam Budi Santoso selama 7 hari (tanpa catatan)
Jaringan Komputer dipinjam Dewi Lestari selama 14 hari (praktikum akhir)Pemanggilan pertama mengirim dua argumen posisional, sehingga days bernilai 7 dan note memperoleh nilai default, sesuai baris pertama keluaran. Pemanggilan kedua menggunakan argumen bernama (named arguments), yaitu bentuk days = 14 yang mengikat setiap nilai pada parameternya secara eksplisit, sehingga urutan penulisannya tidak harus mengikuti urutan deklarasi. Satu aturan yang tersisa adalah argumen posisional harus ditulis sebelum argumen bernama, sehingga pemanggilan campuran tetap dapat diurai compiler.
Kesalahan umum: parameter tanpa val#
Kesalahan yang lazim terjadi adalah menganggap setiap parameter kelas otomatis dapat diakses dari luar. Parameter tanpa val atau var memang dapat dibaca metode di dalam kelas, tetapi compiler menganggapnya anggota privat, sehingga akses dari luar ditolak sebelum program berjalan.
class Buku(judul: String):
def label(): String = s"Label: $judul"
val b = Buku("Algoritma")
println(b.label()) // berjalan normal
println(b.judul) // ditolak compiler: judul bersifat privatPerbaikannya menambahkan val pada parameter, yaitu class Buku(val judul: String), apabila nilai tersebut memang dimaksudkan sebagai bagian antarmuka kelas. Apabila tidak, parameter dibiarkan tanpa val agar detail internal tetap tersembunyi. Dengan kebiasaan ini, penambahan val menjadi keputusan desain yang disengaja dan bukan penulisan yang terlewat.
Kesalahan lain yang berkaitan adalah menuliskan argumen posisional setelah argumen bernama pada satu pemanggilan. Bentuk pinjam("Struktur Data", days = 7, "belum kembali") ditolak compiler karena argumen setelah days = 7 tidak lagi dapat dipetakan ke posisinya dengan pasti. Perbaikannya, samakan bentuk seluruh argumen yang mengikuti, yaitu beri nama pada sisa argumen atau pindahkan seluruh nilai posisional ke awal pemanggilan. Aturan ini menjaga agar pemanggilan campuran tetap dapat diurai dari kiri ke kanan tanpa kejutan.
Ringkasan#
- Constructor utama ditulis pada kepala deklarasi kelas, dan parameter dengan
valatauvarlangsung menjadi field milik kelas. - Parameter tanpa
valbersifat privat, dapat dibaca metode di dalam kelas, tetapi tidak dapat diakses dari luar. - Metode instansi dideklarasikan dengan
def, mengembalikan nilai terakhir dari tubuhnya, dan memiliki akses ke seluruh field termasuk yangprivate. - Nilai default menghilangkan argumen yang berulang, sedangkan argumen bernama membebaskan urutan penulisan dengan pengikatan yang eksplisit.
Referensi#
- Classes — Tour of Scala — Menjelaskan sintaks kelas, constructor utama, dan pembuatan instance pada dokumentasi resmi.
- Default Parameter Values — Tour of Scala — Membahas nilai default pada parameter metode dan kelas.
- Named Arguments — Tour of Scala — Menjelaskan pemanggilan dengan argumen bernama beserta aturan urutannya.