Lagi-lagi kamu anggap aku sebagai….

Aaah…cukup sudah semua ini, tidak usah kau tandai aku dengan label seperti itu.

– The meongs


Pendahuluan

Java Marker Interface ?

Biasanya yang kita tau bahwa Interface digunakan sebagai contract dengan class lain.

Bisa jadi Interfacenya sebagai :

  • Interface java seperti biasanya.
  • Single Abstract Method interfaces (SAM Interfaces) yang hanya punya satu method saja.
  • Functional Interface yang diperkenalkan di Java 8, mirip-mirip dengan SAM / Single Abstract Method Interface di atas.

Akan tetapi ada namanya Marker Interface, yang tidak mempunyai method apa-apa.

Makanya namanya Marker Interface.

Cuma sebagai penanda saja bagi program lain yang menganalisa object implementasinya dari Marker Interface itu diwaktu Runtime.


Contohnya Marker Interface itu seperti apa ?


Contohnya :

  • java.io.Serializable
  • java.lang.Cloneable
  • java.rmi.Remote

Sebagai bagian dari library nya Java, maka ketiga Marker Interface diatas ditujukan untuk kebutuhan JVM dalam melakukan pengaturan Object .

Kita lihat masing-masing contoh di atas :

------
package java.io;

public interface Serializable {}

------
package java.lang;

public interface Cloneable {}

------
package java.rmi;

public interface Remote {}


Benar kaan, nggak ada method/fungsi sama sekali di dalamnya.

Sesuai namanya, maka Class yang memakai interface ini oleh JVM akan bisa untuk :

  • di Serialize
  • atau di Clone
  • atau dipanggil secara Remote

Ketiganya tidak mempunyai method di dalamnya, benar-benar kosongan seperti code diatas.

Tapi berguna nantinya diwaktu proses oleh JVM atau compilernya.


Bagaimana contoh sederhananya ?


Misalnya untuk kasus Serializable.

Ketika misalnya kita memanggil fungsi untuk menulis Object ke file (atau dilakukan serialisasi terhadap objek tersebut), maka biasanya kita bisa memanggil sbb :

--------
// ClassA yang punya satu attribute - attribute1
@Slf4j
@Data
public class ClassA  {

	private String attribute1;

}

--------

// Class pemanggil classA
public static void main(String[] args) throws IOException {

  // buat OutputStream
  FileOutputStream fos = new FileOutputStream("serializeObj.ser");
  ObjectOutputStream oos = new ObjectOutputStream(fos);

  // buat class yang mau diserialized
  ClassA cA = new ClassA();
  cA.setAttribute1("TEST");

  // tulis ke file / serialisai
  oos.writeObject(cA);
  oos.close();
}

Kalau kita jalankan program main diatas, maka akan keluar error :

Exception in thread "main" java.io.NotSerializableException: com.example.demo.ClassA
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1193)

Hal ini karena ClassA tidak kita Mark/Tag sebagai class yang mengimplementasikan Serializable

Hal ini karena di waktu program diatas dijalankan, maka JVM akan mengecek dahulu apakah class tersebut implements marker interface Serializable atau tidak.

Kalau ternyata tidak, maka dilemparlah java.io.NotSerializableException.

Oleh karenanya, code diatas bisa kita ubah sbb :


--------
// ClassA yang punya satu attribute - attribute1
@Slf4j
@Data
public class ClassA  implements Serializable {

	private String attribute1;

}

Dan akhirnya code kita berjalan lancar, dan membuat sebuah file serializeObj.ser sebagai hasil Serialisasi dari classA tadi.

Dengan cara ini kita bisa mengatur sebuah class apakah boleh di sharing ke program lain, atau disimpan ke database, atau keluar dari lingkungan JVM kita.


Custom Marker Interfaces


Dengan tujuan yang sama, kita bisa membuat Marker Interface yang kita buat sendiri.

Namanya tentu saja Custom Marker Interface.

Dengan membuat sebuah Marker Interface, kita bisa menambahkan Filter terhadap class yang sudah ada.

Sama seperti kasus diatas sebelumnya.

Dan akan lebih berguna lagi kalau kita gunakan untuk Filter untuk kasus Polyorphism dari banyak class yang setipe.

Marker Interface akan berguna untuk Filter sekaligus Kategorisasi dari class-classa yang setipe.


Bagaimana contoh kasusnya ?

Misalkan kita punya tipe Interface Rumah.

Dan ada banyak class implementornya , yaitu :

  • class RumahClassic
  • class RumahMinimalis
  • class RumahSkandinavia
  • class RumahJapanese
  • class RumahSusun

Semua class implementor diatas merupakan contoh kasus Polymorphism.

Dan ternyata interface Rumah mempunyai fungsi untuk Renovasi.

Ternyata renovasi yang dibolehkan ada 3 :

  • Renovasi vertikal, yaitu menambah lantai bangunan.
  • Renovasi horizontal, yaitu menambah bangunan kesamping, di lahan tanah yang kosong.
  • Atau cuma renovasi interior saja.

Kemudian ternyata ada standarisasi bahwa rumahSkandinavian tidak bisa direnovasi vertikal. (karena konsepnya yang cuma satu lantai).

Atau rumahSusun tidak bisa direnovasi vertikal ataupun horizontal (karena konsepnya yang sebagai apartemen).

Pendekatan yang kita lakukan bisa 2 :

  • Memakai if..then…else untuk kasus renovasi untuk class RumahSkandinavia.
  • Memakai Marker Interface di class-class implementor nya tersebut.

Coba kita lihat pendekatannya ini satu persatu di artikel selanjutnya