Mengintip fitur-fitur Scala 3.8: baseline JDK 17, Better Fors (SIP-62) yang stabil, runtimeChecked (SIP-57), REPL yang dipisah, plus eksperimen strict-equality dan flexible varargs — dan memahami strategi rilis LTS versus Next beserta perbedaan 3.3.8 dan 3.8.x.

Selama 19 episode, kalian memakai Scala 3.8.4 tanpa terlalu memikirkannya. Sekarang saatnya memutar waktu: episode ini membedah apa yang baru di Scala 3.8 dan, lebih penting, mengapa strategi rilis Scala dipecah menjadi LTS dan Next. Memahami ini membuat kalian memilih versi yang tepat untuk library, aplikasi, dan perusahaan.
Mengapa penting? Karena keputusan versi bukan sekadar "pakai yang terbaru". Di dunia produksi, versi menentukan kompatibilitas JDK, ketersediaan library, dan kapan fitur berhenti berubah. Episode ini memberi kalian peta untuk membuat keputusan itu dengan percaya diri.
Sejak Scala 3.3 (2023), rilis Scala dibagi dua jalur:
| Jalur | Contoh versi | Karakteristik | Untuk siapa |
|---|---|---|---|
| LTS | 3.3.x (terkini 3.3.8) | Stabil, kompatibilitas ketat, mendukung JDK 8+ | Library, perusahaan, produksi konservatif |
| Next | 3.8.x (terkini 3.8.4) | Fitur terbaru, rilis cepat | Aplikasi yang mau inovasi |
Scala 3.3.8 (rilis 10 Juni 2026) adalah LTS dengan dukungan JDK 8 — penting untuk library yang harus berjalan di lingkungan tua. Scala 3.8.4 (rilis 5 Juni 2026) adalah Next terkini dengan baseline JDK 17. Next LTS berikutnya adalah 3.9 (JDK 17) yang sedang dalam RC pada pertengahan 2026.
Note
Aturan praktis: tulis library → rilis ke LTS (konsumen library butuh stabilitas maksimal). Bangun aplikasi → boleh Next untuk fitur baru, dengan syarat siap mengikuti upgrade kecil. Series ini memakai 3.8.4 untuk belajar fitur modern, tetapi konsep yang kalian pelajari 100% berlaku di 3.3.8.
Perubahan paling mendasar di Scala 3.8: standar library dikompilasi dengan Scala 3 dan baseline runtime naik ke JDK 17. Alasan praktisnya: JDK 17 adalah LTS pertama dengan penghapusan sun.misc.Unsafe yang direncanakan (JEP 471), sehingga compiler Scala harus disesuaikan. Dampaknya bagi kalian:
scala -version
java -versionjava -version harus 17 atau lebih baru — seperti yang kita atur di episode 0. Jika project memakai JDK 8, kalian harus di jalur LTS 3.3.x.
Better Fors adalah penyempurnaan for-comprehension — fitur yang paling sering dipakai developer Scala. SIP-62 menambahkan bentuk desugaring yang lebih bersih untuk komposisi:
for
x <- Option(3)
y <- Option(4)
yield x * y // Some(12)Better Fors di 3.8 menstabilkan aturan sehingga transformasi for menghasilkan kode yang lebih dapat diprediksi, dan membuka komposisi pattern lebih ekspresif:
case class Point(x: Int, y: Int)
val points = List(Point(1, 2), Point(3, 4))
val sumX = for
Point(x, _) <- points
yield x
// List(1, 3)Stabil berarti: perilaku ini sudah final dan aman dipakai di produksi tanpa flag eksperimental.
runtimeChecked (atau "safe runtime checks") adalah mekanisme untuk menghilangkan pembatasan performa yang selama ini menghalangi optimasi JVM. Simplifikasinya: library bisa memilih untuk mematikan pemeriksaan runtime tertentu yang mencegah JVM melakukan optimisasi, sehingga kode Scala 3.8 bisa lebih cepat dengan semantik yang sama.
// sebelum: ada pembatasan yang menghalangi optimasi
// sesudah: compiler tahu kapan check bisa dilewati dengan amanIni perubahan infrastruktur compiler yang tidak terlihat di sintaks, tetapi berpengaruh pada kinerja library yang dioptimalkan — alasan lain versi 3.8 penting bagi aplikasi sensitif performa (kita lanjut di episode 21).
Sejak 3.8, REPL dipisah dari distribusi inti menjadi artifact scala3-repl. Tujuannya: kompilasi inti (scalac + runtime) menjadi lebih ringan dan cepat, sementara REPL dikembangkan lebih independen. Dampaknya bagi kalian:
cs install scala3-repl
scalaJika scala tidak membuka REPL setelah upgrade ke 3.8, kemungkinan besar scala3-repl belum terinstall — seperti yang kita singgung di episode 3.
Beberapa fitur masih eksperimental (perlu flag) dan akan dinilai untuk rilis mendatang:
| Fitur | SIP | Ide inti |
|---|---|---|
| strict-equality | SIP-67 | Menolak == antar tipe yang tidak berhubungan — mencegah perbandingan tak masuk akal |
| flexible varargs | SIP-70 | Penanganan varargs yang lebih fleksibel dan aman |
into conversions | SIP-71 | Konversi tipe eksplisit yang terkendali saat memanggil API |
Contoh singkat strict-equality:
// dengan flag -language:strictEquality
// val result = 42 == "empat puluh dua" // ditolak: Int vs StringFitur-fitur ini berubah sampai stabil; untuk produksi, tunggu versi stabil dan dokumentasi resmi — jangan mengandalkan perilaku eksperimental di aplikasi penting.
Peta keputusan sederhana:
Satu hal penting dari catatan rilis: 3.8.1+ disarankan — 3.8.0 punya runtime regression yang diperbaiki di 3.8.1. Untuk versi apa pun, selalu verifikasi:
scala -version
scalac -versionInti yang harus dibawa pulang:
for lebih prediktabel; runtimeChecked (SIP-57) membuka optimasi kinerja.scala3-repl; install terpisah jika scala tidak membukanya.Di episode 21 selanjutnya, kita memanfaatkan semua pemahaman ini untuk kecepatan: performance dan optimization — menghindari alokasi berlebihan, Array vs collections, tuning JVM, serta profiling dengan JFR, async-profiler, dan JMH. Sampai jumpa di episode 21!