โ† Kembali ke Konsep OOP
๐Ÿ”
Pilar

Encapsulation (Enkapsulasi)

Menyatukan data dan method yang mengolah data tersebut dalam satu unit, serta membatasi akses langsung ke state internal objek.

Masalahnya

Tanpa encapsulation, kode dari luar bisa langsung membaca dan mengubah field sebuah objek. Akibatnya muncul state yang tidak valid, invariant yang rusak, dan keterikatan erat antara pemanggil dengan detail implementasi internal.

Cara Kerja

  • โ€บField dibuat private; akses dilakukan melalui method public atau computed property
  • โ€บRepresentasi internal bisa berubah tanpa merusak kode di luar
  • โ€บLogika validasi dan pengecekan invariant berada di satu tempat; setter yang menegakkan aturannya
  • โ€บMengurangi keterikatan: pemanggil bergantung pada perilaku, bukan struktur internal

Kapan Digunakan

โœ“Menjaga invariant (misalnya saldo tidak boleh negatif)
โœ“Menyembunyikan detail implementasi yang mungkin berubah nanti
โœ“Menyediakan API yang terkontrol dan seminimal mungkin untuk sebuah class

Contoh di Dunia Nyata

๐ŸŽ
iOS

Property private(set) dan computed property dengan setter custom

๐Ÿค–
Android

Field private di Kotlin yang diakses lewat getter/setter custom atau validasi di data class

๐ŸŒ
Web

Private class field JavaScript (#balance) yang hanya bisa diakses lewat method

Contoh Kode

Swift
class BankAccount {
    private var balance: Double = 0

    init(initialBalance: Double) {
        balance = initialBalance
    }

    func deposit(_ amount: Double) {
        guard amount > 0 else { return }
        balance += amount
    }

    func withdraw(_ amount: Double) -> Bool {
        guard amount > 0, amount <= balance else { return false }
        balance -= amount
        return true
    }

    var currentBalance: Double { balance }
}

let account = BankAccount(initialBalance: 100)
account.deposit(50)
print(account.currentBalance)  // 150