Study
Akka

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.

Editor Latihan

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.