OOP Encapsulation untuk validasi

Ini adalah artikel penjelas untuk artikel utama mengenai encapsulation dalam bahasa pemrograman java.

Artikel ini mengulas contoh sederhana yang memperlihatkan sebuah use case (contoh kasus) dimana sebuah teknik encapsulation diperlukan untuk memastikan agar object dari class bersangkutan mengikuti aturan tertentu.

Perhatikan contoh class Segitiga berikut, kemudian jalankan kode pada kolom sebelah kanan.

class Segitiga {
  private double pjgSisiA; 
  private double pjgSisiB; 
  private double pjgSisiC; 
  // constructor
  Segitiga(double a,double b, double c) {
    this.pjgSisiA = a;
    this.pjgSisiB = b;
    this.pjgSisiC = c;
  }
}

Class Segitiga seperti pada kode di atas memiliki tiga buah fields (pjgSisiA, pjgSisiB, pjgSisiC) yang mewakili panjang ketiga sisinya.

Pada class Main, tepatnya pada method main(), dibuat sebuah object Segitiga s dan pemberian nilai pada sisi-sisinya.

Perhatikan nilai yang diberikan pada tiga sisi segitiga tersebut. Kombinasi ketiga nilai yang diberikan tidak mungkin membentuk sebuah segitiga karena sisi c (yang terpanjang) lebih panjang dari jumlah panjang kedua sisi lainnya. Dengan kata lain, object segitiga yang dibuat tidak valid.

Pada kasus seperti ini kita dapat memanfaatkan teknik encapsulation dengan menyediakan mekanisme yang melakukan validasi/memeriksa terlebih dahulu nilai sisi segitiga bila ia diinstansiasi maupun diubah salah satu sisinya.

Perhatikan contoh implementasinya pada kode berikut

class Segitiga {
  private double pjgSisiA; 
  private double pjgSisiB; 
  private double pjgSisiC; 
  // constructor
  Segitiga(double a,double b, double c) {
    tetapkanNilaiSisi(a,b,c);
  }
  // menetapkan nilai sisi dengan validasi terlebih dahulu
  private void tetapkanNilaiSisi(double a,double b,double c) {
    double max = a;
    if (b > max) max = b;
    if (c > max) max = c;
    double ratio = max / (a+b+c);    
    if (ratio < 0.5) {
      this.pjgSisiA = a;
      this.pjgSisiB = b;
      this.pjgSisiC = c;
    } else {
      throw new IllegalArgumentException("Nilai sisi tidak valid");
    }
  }  
  // getters & setters
  public double getPjgSisiA() {
    return this.pjgSisiA;
  }
  public void setPjgSisiA(double pjg) {
    tetapkanNilaiSisi(pjg, this.pjgSisiB, this.pjgSisiC);
  }
  public double getPjgSisiB() {
    return this.pjgSisiB;
  }
  public void setPjgSisiB(double pjg) {
    tetapkanNilaiSisi(this.pjgSisiA, pjg, this.pjgSisiC);
  }
  public double getPjgSisiC() {
    return this.pjgSisiC;
  }
  public void setPjgSisiC(double pjg) {
    tetapkanNilaiSisi(this.pjgSisiA, this.pjgSisiB, pjg);
  }
  
}

Pada susunan class yang baru, terdapat beberapa perubahan sebagai berikut:

Fields bertipe private

Pada baris 2 s.d 4 seluruh fields panjang sisi, diberikan access modifier bertipe private. Konsekuensinya, seluruh field bersangkutan tidak dapat diakses langsung dari object, baik untuk mendapatkan nilai maupun memberikan nilai.

Getter & Setter

Akses untuk mendapatkan nilai panjang ketiga sisi segitiga kemudian diberikan melalui getter untuk masing-masing field panjang sisi.

Akses untuk mengubah nilai panjang masing-masing sisi diberikan melalui setter panjang sisi bersangkutan.

Validasi nilai sisi

Sebelum menetapkan nilai sisi, terlebih dahulu dilakukan validasi melalui method tetapkanNilaiSisi(). Ini dilakukan baik sekaligus melalui constructor saat inisiasi (baris 8), ataupun satu persatu via setter masing-masing sisi (29,35,41). Jika nilai panjang sisi yang diberikan menyebabkan segitiga yang dibentuk menjadi tidak valid, program akan menghasilkan exception.

Untuk lebih jelasnya, jalankan kode berikut, perhatikan bahwa terjadi Exception pada baris ke-5 saat sisi segitiga diubah dengan nilai yang menjadikan objectnya tidak valid.

Semoga bermanfaat,

Salam

You may also like...

Berikan komentar