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:
- Deklarasikan field sebagai
private - Sediakan method
publicgetter 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.

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
protectedcuma 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 methodpublic - Getter:
public TipeData getNamaField(), untukbooleanpakaiisNamaField() - Setter:
public void setNamaField(TipeData namaField) - Pakai
thiskalau 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