Memahami Immutable Class Dan Objek Pada Java

Apa Itu Immutable Class dan Objek?

Immutable artinya tidak dapat diubah, atau permanen atau tetap. Jadi class yang immutable adalah class yang ketika dibuat, kontennya tidak dapat diubah.

Sedangkan immutable objek adalah objek yang ketika dibuat, maka apa yang dimiliki oleh objek tersebut (object state) tidak bisa diubah.

immutable_class_dan_objek


Misalnya objek siswa memiliki state berupa nama, usia, tanggal masuk dan sebagainya, jika objek siswa itu immutable, maka nilai dari state-nya tidak bisa diubah setelah objek siswa itu dibuat.

Beberapa contoh class immutable pada Java adalah String, Boolean, Byte, Short, Integer, Long, Float, Double dan sebagainya. Class-class ini termasuk dalam wrapper class, yaitu class yang objeknya mengandung tipe data primitif.

Ketika objek dibuat dari wrapper class tersebut, maka objek itu memiliki field, dan di dalam field tersebut data primitif dapat disimpan.



Bagaimana Cara Untuk Membuat Immutable Class dan Objek?

Untuk membuat immutable class, beberapa langkah di bawah ini harus diikuti:

1. Mendeklarasikan class sebagai final.

Dengan mendeklarasikan class sebagai final, maka class tersebut tidak bisa diwariskan / inherited dan method-nya juga tidak bisa di-overriding oleh subclass-nya.

2. Mengatur nilai dari properti class hanya dengan menggunakan konstruktor.

3. Membuat semua properti / fields pada class menjadi final dan private.

Dengan membuat properti / fields menjadi final, maka nilai dari field tersebut tidak bisa diubah.

4. Tidak menggunakan method setters

Dengan tidak menggunakan method setters, maka class tidak memiliki method yang dapat memodifikasi nilai dari fields class.

5. Memerlukan perhatian khusus bila menggunakan variabel instance yang mutable.
Suatu variabel instance bisa bersifat mutable ataupun immutable. Jadi untuk mengatasinya adalah dengan mengenalinya dan mengembalikan objek baru yang memiliki salinan konten dari mutable objek

Contoh Dari Immutable dan Mutable Class

a. Mutable Class
Sebelum menuju ke contoh immutable class, berikut ini adalah contoh simpel dari mutable class dengan mutable objek (objek yang state nya dapat diubah) :

class Siswa
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.bahasaJava.mutableClass;

public class SiswaMutable {
 
 private String nama;
 private int usia;
 
 public SiswaMutable(String nama, int usia){
  
  this.nama = nama;
  this.usia = usia;
 }
 
 
 //Getter dan setter method nama
 public String getNama() {
  return nama;
 }
 public void setNama(String nama) {
  this.nama = nama;
 }
 
 //Getter dan setter method usia
 public int getUsia() {
  return usia;
 }
 public void setUsia(int usia) {
  this.usia = usia;
 }
 
 //Method toString akan mengembalikan string
 //yang merupakan representasi dari objek
 public String toString(){
  
  return "Nama siswa adalah " + nama + " " +
  "berumur " + usia + " tahun";
  
 }
 
}


class TestSiswaMutable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.mutableClass;

public class TestSiswaMutable {
 
 public static void main(String args []){
  
  SiswaMutable siswaMutable = new SiswaMutable("Atta", 12);
  System.out.println(siswaMutable);
  
  //set method akan mengubah state dari objek itu
  siswaMutable.setNama("Zia");
  siswaMutable.setUsia(15);
  System.out.println("Setelah state objek berubah : ");
  System.out.println(siswaMutable);
  
 }

}

Output:
Nama siswa adalah Atta berumur 12 tahun
Setelah state objek berubah :
Nama siswa adalah Zia berumur 15 tahun

Dari output tersebut bisa dilihat bahwa state objek telah berubah karena menggunakan setter method.

b. Immutable class dan objek

Berikut ini adalah contoh dari immutable class dan objek:

class SiswaImmutable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.bahasaJava.ImmutableClass;

//Class dideklarasikan final
public final class SiswaImmutable {
 
 //Class field adalah private dan final
 private final String nama;
 private final int usia;
 
 //Konstruktor untuk mengatur properti class
 public SiswaImmutable(String nama, int usia){
  
  this.nama = nama;
  this.usia = usia;
 }
 
 
 //Hanya menyediakan getter method tanpa setter method
 //untuk mengembalikan nilai field
 public String getNama() {
  return nama;
 }
 
 //Method toString akan mengembalikan string
 //yang merupakan representasi dari objek
 public String toString(){
  
  return "Nama siswa adalah " + nama + " " +
  "berumur " + usia + " tahun";
  
 }
 
}

class TestSiswaImmutable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package com.bahasaJava.ImmutableClass;

public class TestSiswaImmutable {
 
 public static void main(String args []){
  
  //Ini adalah immutable objek
  //State dari objek ini tidak bisa diubah
  SiswaImmutable siswaImmutable = new SiswaImmutable("Atta", 12);
  System.out.println(siswaImmutable);
  
  
 }

}


c. Trik untuk class yang memiliki variabel instance mutable

Berikut ini adalah contoh class yang walaupun telah mengikuti cara-cara di atas, namun class tersebut masih mutable, karena ada variabel instance yang mutable yaitu tanggalDaftar dengan tipe Date, lihat line 12 pada kode dibawah ini:

class SiswaMutable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.bahasaJava.mutableClass;

import java.util.Date;

//Class dideklarasikan final
public final class SiswaMutable {
 
 //Class field adalah private dan final
 private String nama;
 private int usia;
 //tanggalDaftar merupakan variabel instance mutable
 private final Date tanggalDaftar;
 
 //Konstruktor untuk mengatur properti class
 public SiswaMutable(String nama, int usia, Date tanggalDaftar){
  
  this.nama = nama;
  this.usia = usia;
  this.tanggalDaftar = new Date(tanggalDaftar.getTime());
 }
 
 
 //Hanya menyediakan getter method tanpa setter method
 //untuk mengembalikan nilai field
 public String getNama() {
  return nama;
 }
 
 public int getUsia() {
  return usia;
 }
 
 public Date getTanggalDaftar() {
  return tanggalDaftar;
 }


 //Method toString akan mengembalikan string
 //yang merupakan representasi dari objek
 public String toString(){
  return "Nama siswa adalah " + nama + " " +
  "berumur " + usia + " tahun, " + "tanggal daftar " + tanggalDaftar;
 }
 
}

class TestSiswaMutable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.bahasaJava.mutableClass;
import java.util.Date;
public class TestSiswaMutable {
 
 public static void main(String args []){
  
  SiswaMutable siswaMutable = new SiswaMutable("Atta", 12, new Date());
  System.out.println(siswaMutable);
  
  System.out.println();
  
  System.out.println("Setelah menggunakan method ubah state objek(): ");
  
  ubahStateObjek(siswaMutable.getTanggalDaftar());
  System.out.println(siswaMutable);
 }
 
 
 
 static void ubahStateObjek(Date tanggalDaftar){
  tanggalDaftar.setDate(20);//Diubah menjadi tanggal 20 
 }

}

Contoh output:
Nama siswa adalah Atta berumur 12 tahun, tanggal daftar Fri Jul 28 18:24:59 ICT 2017

Setelah menggunakan method ubah state objek():
Nama siswa adalah Atta berumur 12 tahun, tanggal daftar Thu Jul 20 18:24:59 ICT 2017


Dari output tersebut terlihat bahwa tanggal daftar telah berubah, hal ini karena class java.util.Date memiliki method setDate() untuk menetapkan tanggal.

Oleh karena itu, untuk membuat objek itu immutable, maka harus mengembalikan objek baru dengan salinan konten dari objek mutable tersebut. 

Perhatikan pada line 35-43 dari kode program class SiswaImmutable di bawah ini:

class SiswaImmutable

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.bahasaJava.ImmutableClass;

import java.util.Date;

//Class dideklarasikan final
public final class SiswaImmutable {
 
 //Class field adalah private dan final
 private String nama;
 private int usia;
 //tanggalDaftar merupakan variabel instance mutable
 private final Date tanggalDaftar;
 
 //Konstruktor untuk mengatur properti class
 public SiswaImmutable(String nama, int usia, Date tanggalDaftar){
  
  this.nama = nama;
  this.usia = usia;
  this.tanggalDaftar = new Date(tanggalDaftar.getTime());
 }
 
 
 //Hanya menyediakan getter method tanpa setter method
 //untuk mengembalikan nilai field
 public String getNama() {
  return nama;
 }
 
 public int getUsia() {
  return usia;
 }
 
 
 /*
  Class Date adalah mutable jadi perlu perhatian khusus.
  Method ini tidak boleh mengembalikan referensi dari 
  variabel instance yang asli.
  Oleh karena itu, method ini harus mengembalikan objek
  baru dari class Date dengan konten yang sama dari 
  */
 public Date getTanggalDaftar() {
  return new Date(tanggalDaftar.getTime());
 }
 
 
 //Method toString akan mengembalikan string
 //yang merupakan representasi dari objek
 public String toString(){
  return "Nama siswa adalah " + nama + " " +
  "berumur " + usia + " tahun, " + "tanggal daftar " + tanggalDaftar;
 }
 
}


class TestSiswaImmutable

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.bahasaJava.ImmutableClass;

import java.util.Date;

public class TestSiswaImmutable {
 
 public static void main(String args []){
  
  SiswaImmutable siswaImmutable = new SiswaImmutable("Atta", 12, new Date());
  System.out.println(siswaImmutable);
  
  System.out.println();
  
  System.out.println("Setelah menggunakan method ubah state objek(): ");
  
  ubahStateObjek(siswaImmutable.getNama(), siswaImmutable.getUsia(), siswaImmutable.getTanggalDaftar());
  System.out.println(siswaImmutable);
 }
 
 
 
 static void ubahStateObjek(String nama, int usia, Date tanggalDaftar){
  tanggalDaftar.setDate(20);//Diubah menjadi tanggal 20 
 }

}

Contoh output:
Nama siswa adalah Atta berumur 12 tahun, tanggal daftar Fri Jul 28 19:37:42 ICT 2017

Setelah menggunakan method ubah state objek():
Nama siswa adalah Atta berumur 12 tahun, tanggal daftar Fri Jul 28 19:37:42 ICT 2017

Dari output terlihat bahwa walaupun kita sudah menggunakan method ubahStateObjek() untuk mengganti tanggal, namun tanggal tetap tidak berubah.

No comments

Bahasa Java. Powered by Blogger.