Berkat polymorphism, sebuah variabel bertipe Object atau superclass boleh menampung objek dari class apa pun turunannya. Keleluasaan itu menimbulkan pertanyaan baru pada saat runtime: objek yang sedang kita pegang ini sebenarnya instance dari tipe apa? Operator instanceof menjawab pertanyaan tersebut — ekspresi obj instanceof Tipe dievaluasi JVM menjadi boolean tanpa mengubah objeknya. Versi Java modern menambahkan kemampuan pattern matching: obj instanceof String s menguji tipe sekaligus mengikat objek ke variabel s, menghapus kebutuhan cast manual yang selama ini menyertai pola klasik. Pada Chapter ini kita bedah keduanya dari contoh paling sederhana hingga hirarki class.
Mengenal instanceof #
Operator instanceof menerima operand kiri berupa referensi objek dan operand kanan berupa tipe. Hasilnya true bila objek yang dirujuk memang instance dari tipe tersebut (atau dari subclass-nya), dan false bila bukan. Kasus khususnya penting dihafal: pembandingan terhadap null selalu menghasilkan false — null bukan instance dari tipe apa pun, dan JVM tidak melempar NullPointerException pun ClassCastException untuk pemeriksaan semacam ini.
public class CekTipeObjek {
public static void main(String[] args) {
Object[] keranjang = {"Budi", 25, 55.5, null};
for (Object item : keranjang) {
System.out.println(item + " -> String? " + (item instanceof String));
}
}
}Output yang Dihasilkan:
Budi -> String? true
25 -> String? false
55.5 -> String? false
null -> String? falseBaris 3 mendeklarasikan array Object berisi empat elemen dengan tipe runtime yang berbeda-beda — String, Integer, Double, dan null. Baris 6 menguji setiap elemen terhadap String: hanya "Budi" yang menghasilkan true, sementara elemen null aman menghasilkan false tanpa exception. Perhatikan juga bahwa tanda kurung di sekitar item instanceof String menjaga operator + tidak lebih dulu menggabungkan teks.
Pattern Matching untuk instanceof #
Pola klasik sebelum Java 16 membutuhkan dua langkah: uji dengan instanceof, lalu downcast manual dengan (String) obj di dalam blok. Pattern matching menggabungkan keduanya menjadi satu konstruksi — if (obj instanceof String s) menguji tipe dan, bila berhasil, otomatis mengikat objek ke variabel s yang sudah bertipe String. Variabel s hanya berlaku pada wilayah kode yang dijamin JVM bertipe String, yaitu di dalam blok if tersebut. Fitur ini difinalkan pada Java 16 melalui JEP 394 sehingga aman dipakai pada Java 25.
public class PencocokanPola {
public static void main(String[] args) {
Object[] data = {"Budi", 25, 55.5};
for (Object item : data) {
if (item instanceof String s) {
System.out.println("Teks: " + s + " (panjang " + s.length() + ")");
} else if (item instanceof Integer i) {
System.out.println("Bilangan bulat: " + (i + 1));
} else if (item instanceof Double d) {
System.out.println("Bilangan pecahan: " + d);
}
}
}
}Output yang Dihasilkan:
Teks: Budi (panjang 4)
Bilangan bulat: 26
Bilangan pecahan: 55.5Mari kita telaah baris-baris kode di atas:
- Baris 6 (
if (item instanceof String s)): JVM menguji tipe runtimeitem; karena berhasil, variabelslangsung bertipeString— methods.length()dipanggil tanpa cast manual. - Baris 8 (
else if (item instanceof Integer i)): pola yang sama untukInteger;i + 1menghasilkan26karenaisudah diperlakukan sebagai bilangan bulat. - Baris 10 (
else if (item instanceof Double d)): rantaielse ifmemilah setiap elemen tepat satu cabang — struktur inti pengolahan data bertipe campuran.
instanceof pada Hirarki Class #
Kekuatan instanceof paling terasa pada hirarki class. Variabel bertipe Hewan boleh menampung objek Kucing maupun Burung karena keduanya subclass-nya — inilah polymorphism. Operator instanceof mengetahui tipe objek sesungguhnya saat runtime, sehingga program dapat memilah perlakuan: objek Kucing mendapat perlakuan kucing, objek Burung mendapat perlakuan burung, dan objek Hewan murni jatuh ke cabang terakhir.
public class HirarkiHewan {
static class Hewan {}
static class Kucing extends Hewan {}
static class Burung extends Hewan {}
public static void main(String[] args) {
Hewan[] daftar = {new Kucing(), new Burung(), new Hewan()};
for (Hewan h : daftar) {
if (h instanceof Kucing) {
System.out.println("Ini kucing");
} else if (h instanceof Burung) {
System.out.println("Ini burung");
} else {
System.out.println("Hewan umum");
}
}
}
}Output yang Dihasilkan:
Ini kucing
Ini burung
Hewan umumBaris 3-4 mendeklarasikan dua subclass dari Hewan — seluruh objeknya sah disimpan ke array bertipe Hewan[] pada baris 7. Loop mulai baris 9 lalu memilah tipe runtime tiap elemen: Kucing terdeteksi lebih dulu, Burung menyusul, dan objek Hewan murni tidak cocok dengan kedua subclass sehingga jatuh ke else. Perlu dicatat: new Kucing() instanceof Hewan juga bernilai true — setiap objek subclass adalah sekaligus instance dari superclass-nya.
Dengan instanceof, kotak peralatan operator objek kita lengkap. Satu topik penutup Section ini menyatukan semuanya: urutan pengerjaan operator ketika banyak operator bertemu dalam satu ekspresi. Chapter berikutnya membahas operator precedence — aturan yang menentukan a + b * c dihitung jadi 16 sementara (a + b) * c dihitung jadi 36.
Referensi #
- Java Language Specification — Bab 15 Expressions
- JEP 394: Pattern Matching for instanceof
- Oracle Dev.java — Learn Java
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
CekTipeObjek.java
Unduh berkaspublic class CekTipeObjek {
public static void main(String[] args) {
Object[] keranjang = {"Budi", 25, 55.5, null};
for (Object item : keranjang) {
System.out.println(item + " -> String? " + (item instanceof String));
}
}
}
HirarkiHewan.java
Unduh berkaspublic class HirarkiHewan {
static class Hewan {}
static class Kucing extends Hewan {}
static class Burung extends Hewan {}
public static void main(String[] args) {
Hewan[] daftar = {new Kucing(), new Burung(), new Hewan()};
for (Hewan h : daftar) {
if (h instanceof Kucing) {
System.out.println("Ini kucing");
} else if (h instanceof Burung) {
System.out.println("Ini burung");
} else {
System.out.println("Hewan umum");
}
}
}
}
PencocokanPola.java
Unduh berkaspublic class PencocokanPola {
public static void main(String[] args) {
Object[] data = {"Budi", 25, 55.5};
for (Object item : data) {
if (item instanceof String s) {
System.out.println("Teks: " + s + " (panjang " + s.length() + ")");
} else if (item instanceof Integer i) {
System.out.println("Bilangan bulat: " + (i + 1));
} else if (item instanceof Double d) {
System.out.println("Bilangan pecahan: " + d);
}
}
}
}