Praktikum PBO D 2026/Week4: Encapsulation/Encapsulation

Encapsulation

Encapsulation

Encapsulation itu konsep di OOP buat membungkus data (field) dan method yang mengolah data tersebut ke dalam satu unit, yaitu class. Field di dalam class disembunyikan dari class lain dan cuma bisa diakses lewat method yang disediakan class itu sendiri. Makanya encapsulation juga sering disebut data hiding.

Tujuannya:

  • Melindungi data dari perubahan sembarangan dari luar class
  • Mengontrol cara data dibaca dan diubah (misalnya pakai validasi)
  • Bikin class lebih gampang di-maintain, karena implementasi di dalam bisa diubah tanpa ganggu kode di luar

Cara mencapai encapsulation:

  1. Deklarasikan field sebagai private
  2. Sediakan method public getter dan setter buat baca dan ubah nilai field tersebut
public class NamaClass {
    private TipeData namaField;       // field disembunyikan

    public TipeData getNamaField() {  // getter
        return namaField;
    }

    public void setNamaField(TipeData namaField) {  // setter
        this.namaField = namaField;
    }
}

Access Modifier

Access modifier dipakai buat ngatur visibilitas class, field, method, dan constructor. Encapsulation sangat bergantung sama access modifier ini.

Screenshot 2026-09-28 220337.png

Keterangan kolom:

  • Class: diakses dari dalam class itu sendiri
  • Package: diakses dari class lain di package yang sama
  • Subclass: diakses dari subclass di package yang berbeda
  • World: diakses dari mana aja

public

Bisa diakses dari mana aja.

public class Mobil {
    public String merek;

    public void jalan() {
        System.out.println(merek + " berjalan");
    }
}

private

Cuma bisa diakses dari dalam class itu sendiri. Ini modifier utama buat encapsulation.

public class Mobil {
    private int kecepatan;

    private void cekMesin() {
        System.out.println("Mesin dicek");
    }
}
Mobil m = new Mobil();
m.kecepatan = 100;  // ERROR: kecepatan has private access in Mobil
m.cekMesin();       // ERROR: cekMesin() has private access in Mobil

protected

Bisa diakses dari class di package yang sama dan dari subclass (walaupun beda package).

public class Kendaraan {
    protected int jumlahRoda;

    protected void klakson() {
        System.out.println("Tin tin!");
    }
}
// beda package
public class Motor extends Kendaraan {
    void info() {
        jumlahRoda = 2;  // boleh, karena Motor subclass dari Kendaraan
        klakson();       // boleh
    }
}

Catatan: dari package yang berbeda, member protected cuma bisa diakses lewat pewarisan (dari dalam subclass), bukan lewat objek biasa di class yang gak ada hubungan pewarisan.

Default (Package-Private)

Kalau gak ditulis modifier apa-apa, berarti default. Cuma bisa diakses dari class di package yang sama.

class Helper {
    int nilai;

    void proses() {
        System.out.println("Diproses");
    }
}

Access Modifier untuk Class

Top-level class (class yang bukan di dalam class lain) cuma boleh pakai public atau default.

public class A { }    // boleh
class B { }           // boleh (default)
private class C { }   // ERROR
protected class D { } // ERROR

Selain itu, dalam satu file .java cuma boleh ada satu public class, dan nama file-nya harus sama dengan nama class tersebut.

Getter Method

Getter adalah method public yang mengembalikan nilai dari field private.

Syntax:

public TipeData getNamaField() {
    return namaField;
}

Aturan penamaan:

  • Diawali get + nama field dengan huruf pertama kapital
  • Return type sama dengan tipe field
  • Gak punya parameter
public class Mahasiswa {
    private String nama;
    private int umur;

    public String getNama() {
        return nama;
    }

    public int getUmur() {
        return umur;
    }
}

Getter untuk boolean

Khusus field bertipe boolean, konvensinya pakai awalan is, bukan get.

public class Mahasiswa {
    private boolean aktif;

    public boolean isAktif() {
        return aktif;
    }
}

Setter Method

Setter adalah method public yang dipakai buat mengisi atau mengubah nilai field private.

Syntax:

public void setNamaField(TipeData namaField) {
    this.namaField = namaField;
}

Aturan penamaan:

  • Diawali set + nama field dengan huruf pertama kapital
  • Return type void
  • Punya satu parameter dengan tipe yang sama dengan field
public class Mahasiswa {
    private String nama;
    private int umur;

    public void setNama(String nama) {
        this.nama = nama;
    }

    public void setUmur(int umur) {
        this.umur = umur;
    }
}

Keyword this

Kalau nama parameter sama dengan nama field, this dipakai buat nunjuk field milik objek, bukan parameternya.

public void setNama(String nama) {
    this.nama = nama;  // this.nama = field, nama = parameter
}

Kalau this gak ditulis, yang terjadi adalah parameter di-assign ke dirinya sendiri, dan field gak berubah sama sekali:

public void setNama(String nama) {
    nama = nama;  // SALAH: field nama tetap null
}

Kalau nama parameternya beda, this gak wajib:

public void setNama(String newName) {
    nama = newName;  // tetap benar
}

Penggunaan Getter dan Setter

Mahasiswa mhs = new Mahasiswa();

mhs.setNama("Budi");
mhs.setUmur(20);

System.out.println(mhs.getNama());  // Budi
System.out.println(mhs.getUmur());  // 20

// mhs.nama = "Andi";  // ERROR: nama has private access

Validasi di Setter

Ini salah satu fungsi utama encapsulation: setter bisa mengecek dulu apakah nilai yang dimasukkan valid sebelum disimpan ke field.

public void setUmur(int umur) {
    if (umur > 0) {
        this.umur = umur;
    } else {
        System.out.println("Umur harus lebih dari 0");
    }
}
mhs.setUmur(-5);  // Umur harus lebih dari 0
mhs.setUmur(20);  // tersimpan

Validasi juga bisa dilakukan dengan melempar exception:

public void setUmur(int umur) {
    if (umur <= 0) {
        throw new IllegalArgumentException("Umur harus lebih dari 0");
    }
    this.umur = umur;
}

Read-Only dan Write-Only

Kita gak wajib bikin getter dan setter buat semua field. Dengan memilih method mana yang disediakan, kita bisa ngatur hak akses field.

Read-Only (cuma getter)

Nilai bisa dibaca, tapi gak bisa diubah dari luar class.

public class Akun {
    private String id = "ACC001";

    public String getId() {
        return id;
    }
    // gak ada setId()
}

Write-Only (cuma setter)

Nilai bisa diisi, tapi gak bisa dibaca dari luar class. Cocok buat data sensitif kayak password.

public class Akun {
    private String password;

    public void setPassword(String password) {
        this.password = password;
    }
    // gak ada getPassword()
}

Method Selain Getter dan Setter

Akses ke field private gak harus selalu lewat getter/setter biasa. Class bisa nyediain method lain yang mengubah data dengan aturan tertentu.

public class Counter {
    private int nilai;

    public int getNilai() {
        return nilai;
    }

    public void tambah() {
        nilai++;
    }
}

Di sini nilai gak bisa di-set sembarangan dari luar, cuma bisa bertambah lewat tambah().

Encapsulation dan Constructor

Constructor juga bisa dipakai buat ngisi field private saat objek dibuat. Supaya validasinya konsisten, constructor bisa manggil setter.

public Mahasiswa(String nama, int umur) {
    setNama(nama);
    setUmur(umur);  // validasi di setUmur() ikut jalan
}

Private Method

Encapsulation gak cuma buat field. Method yang cuma dipakai buat keperluan internal class juga sebaiknya dibuat private.

public class Kalkulator {
    public double hitungDiskon(double harga) {
        if (isValid(harga)) {
            return harga * 0.9;
        }
        return 0;
    }

    private boolean isValid(double harga) {  // helper internal
        return harga > 0;
    }
}

Ringkasan

  • Field dibuat private, akses dari luar lewat method public
  • Getter: public TipeData getNamaField(), untuk boolean pakai isNamaField()
  • Setter: public void setNamaField(TipeData namaField)
  • Pakai this kalau nama parameter sama dengan nama field
  • Setter bisa dipakai buat validasi data
  • Cuma getter = read-only, cuma setter = write-only
  • Method yang cuma buat keperluan internal sebaiknya private