Actor State Internal & Become/Context
Penjelasan
Actor sering perlu menyimpan state yang berubah seiring waktu, misal counter atau daftar item. Di Akka Typed, pola idiomatik untuk state yang berubah adalah membuat function yang menerima state sebagai parameter dan mengembalikan `Behavior` baru dengan state yang sudah diperbarui — ini menggantikan konsep `become`/`unbecome` di Akka Classic. Karena state disimpan sebagai parameter function (bukan `var` mutable di dalam class), pendekatan ini menjaga immutability: setiap kali state berubah, kita sebenarnya membuat 'versi baru' dari behavior actor tersebut, bukan memodifikasi objek yang ada. Pola umum: definisikan `def actor(state: TipeState): Behavior[Pesan] = Behaviors.receiveMessage { pesan => ... actor(stateBaru) }`. Actor lalu 'menjadi' behavior baru ini untuk memproses pesan berikutnya. Pendekatan functional ini membuat state actor mudah ditelusuri dan diuji, karena semua perubahan state eksplisit terlihat di tipe kembalian function, bukan tersembunyi lewat mutasi field.
Contoh Konsep
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
object Counter {
sealed trait Pesan
case object Tambah extends Pesan
case object Tampilkan extends Pesan
def apply(): Behavior[Pesan] = hitung(0)
private def hitung(nilai: Int): Behavior[Pesan] = Behaviors.receiveMessage {
case Tambah =>
hitung(nilai + 1) // 'become' behavior baru dengan state terbaru
case Tampilkan =>
println(s"Nilai saat ini: $nilai")
Behaviors.same
}
}
Praktikum
Lengkapi actor Keranjang yang menyimpan daftar item (List[String]) sebagai state, menangani pesan TambahItem(nama) dengan menambah item ke state baru, dan LihatIsi dengan mencetak isi keranjang.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Hindari godaan memakai var mutable di dalam actor meski secara teknis aman (karena satu actor diproses satu thread pada satu waktu) — pola state-lewat-parameter lebih idiomatik di Akka Typed dan jauh lebih mudah diuji secara terisolasi.