Kelas dan Objek · Pelajaran 4 dari 10
Enkapsulasi: private, getter, dan setter
9 menit baca · BelajarCode
Enkapsulasi artinya menyembunyikan detail data di dalam objek dan hanya membuka akses lewat metode. Tujuannya supaya objek selalu dalam keadaan valid. Rekening bank, misalnya, tidak boleh punya saldo negatif.
| Pengubah | Bisa diakses dari |
|---|---|
private | Hanya di dalam kelas itu sendiri |
| tanpa pengubah | Kelas lain dalam paket yang sama |
protected | Paket yang sama dan subkelas |
public | Di mana saja |
1class Rekening {2 private final String pemilik;3 private long saldo;45 Rekening(String pemilik) {6 this.pemilik = pemilik;7 }89 public String getPemilik() {10 return pemilik;11 }1213 public long getSaldo() {14 return saldo;15 }1617 public boolean setor(long jumlah) {18 if (jumlah <= 0) return false;19 saldo += jumlah;20 return true;21 }2223 public boolean tarik(long jumlah) {24 if (jumlah <= 0 || jumlah > saldo) return false;25 saldo -= jumlah;26 return true;27 }28}2930public class Main {31 public static void main(String[] args) {32 Rekening r = new Rekening("Bima");33 System.out.println("Setor 100000: " + r.setor(100000));34 System.out.println("Tarik 150000: " + r.tarik(150000));35 System.out.println("Setor -5000: " + r.setor(-5000));36 System.out.println("Tarik 40000: " + r.tarik(40000));37 System.out.println(r.getPemilik() + ", saldo Rp" + r.getSaldo());38 }39}Setor 100000: true Tarik 150000: false Setor -5000: false Tarik 40000: true Bima, saldo Rp60000
- Atribut
saldodibuatprivate, sehingga kode di luar kelas tidak bisa menulisr.saldo = -1000000. - Saldo hanya bisa berubah lewat
setordantarik, yang memeriksa aturannya lebih dulu. - Getter seperti
getSaldo()membuka akses baca. Tidak ada setter untuk saldo, karena saldo hanya boleh berubah lewat transaksi. finalpadapemilikberarti nilainya hanya bisa diisi sekali, di konstruktor.
Jangan otomatis membuat getter dan setter untuk semua atribut
Setter untuk setiap atribut sama saja dengan membuat atribut itu publik. Pikirkan perilaku apa yang masuk akal, misalnya setor dan tarik, lalu sediakan metode untuk perilaku itu.
Cek pemahaman
Kenapa atribut saldo dibuat private?
Latihan
Kelas Suhu
Buat kelas Suhu dengan atribut private celsius. Sediakan konstruktor, getter, metode setCelsius yang menolak nilai di bawah -273.15 (mengembalikan false), dan metode getFahrenheit().
Pembahasan
1class Suhu {2 private double celsius;34 Suhu(double celsius) {5 if (!setCelsius(celsius)) {6 this.celsius = 0;7 }8 }910 public double getCelsius() {11 return celsius;12 }1314 public boolean setCelsius(double nilai) {15 if (nilai < -273.15) return false;16 celsius = nilai;17 return true;18 }1920 public double getFahrenheit() {21 return celsius * 9 / 5 + 32;22 }23}2425public class Main {26 public static void main(String[] args) {27 Suhu s = new Suhu(30);28 System.out.println(s.getCelsius() + " C = " + s.getFahrenheit() + " F");29 System.out.println("Set -300: " + s.setCelsius(-300));30 System.out.println("Set 100: " + s.setCelsius(100));31 System.out.println(s.getCelsius() + " C = " + s.getFahrenheit() + " F");32 }33}30.0 C = 86.0 F Set -300: false Set 100: true 100.0 C = 212.0 F
Suhu di bawah nol mutlak (-273,15 °C) tidak mungkin secara fisika, jadi ditolak.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.