Instance Operator Java

1. Perkenalan

Dalam tutorial singkat ini, kita akan belajar tentang operator instanceof di Java.

2. Apa contoh Operator?

instanceof adalah operator biner yang digunakan untuk menguji apakah suatu objek memiliki tipe tertentu. Hasil operasi bisa benar atau salah . Ini juga dikenal sebagai operator perbandingan tipe karena ini membandingkan instance dengan tipe.

Sebelum mentransmisikan objek yang tidak diketahui, pemeriksaan instanceof harus selalu digunakan. Melakukan hal ini membantu menghindari ClassCastException pada waktu proses.

The instanceof sintaks dasar operator adalah:

(object) instanceof (type)

Mari kita lihat contoh dasar untuk operator instanceof . Pertama, mari buat Putaran kelas :

public class Round { // implementation details }

Selanjutnya, mari buat Cincin kelas yang memperluas Putaran :

public class Ring extends Round { // implementation details }

Kita dapat menggunakan instanceof untuk memeriksa apakah instance Ring adalah tipe Round :

@Test public void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); Assert.assertTrue(ring instanceof Round); }

3. Bagaimana dengan instanceof Operator Kerja?

The instanceof Operator bekerja pada prinsip yang-hubungan . Konsep hubungan is-a didasarkan pada pewarisan kelas atau implementasi antarmuka.

Untuk mendemonstrasikan ini, mari buat antarmuka Shape :

public interface Shape { // implementation details }

Mari kita juga membuat Circle kelas yang mengimplementasikan antarmuka Shape dan juga memperluas kelas Round :

public class Circle extends Round implements Shape { // implementation details }

Hasil instanceof akan benar jika objeknya adalah instance dari tipe:

@Test public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Circle); }

Ini juga akan benar jika objek adalah turunan dari subkelas dengan tipe:

@Test public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Round); }

Jika tipenya adalah antarmuka, itu akan mengembalikan nilai true jika objek mengimplementasikan antarmuka:

@Test public void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Shape); }

Operator instanceof tidak dapat digunakan jika tidak ada hubungan antara objek yang dibandingkan dan jenis objek yang dibandingkan.

Mari buat Segitiga kelas baru yang mengimplementasikan Bentuk tetapi tidak memiliki hubungan dengan Lingkaran :

public class Triangle implements Shape { // implementation details }

Sekarang, jika kita menggunakan instanceof untuk memeriksa apakah Lingkaran adalah instance Segitiga :

@Test public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { Circle circle = new Circle(); Assert.assertFalse(circle instanceof Triangle); }

Kami akan mendapatkan kesalahan kompilasi karena tidak ada hubungan antara kelas Lingkaran dan Segitiga :

java.lang.Error: Unresolved compilation problem: Incompatible conditional operand types Circle and Triangle

4. Menggunakan instanceof dengan Tipe Objek

Di Java, setiap kelas secara implisit mewarisi dari kelas Object . Oleh karena itu, menggunakan operator instanceof dengan tipe Objek akan selalu bernilai true :

@Test public void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); Assert.assertTrue(thread instanceof Object); }

5. Menggunakan instanceof Operator Ketika Objek Adalah null

Jika kita menggunakan operator instanceof pada objek apa pun yang bernilai null , hasilnya salah . Juga, tidak diperlukan pemeriksaan null saat menggunakan operator instanceof .

@Test public void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; Assert.assertFalse(circle instanceof Round); }

6. instanceof dan Generik

Pengujian dan transmisi instance bergantung pada pemeriksaan informasi jenis pada waktu proses. Oleh karena itu, kami tidak dapat menggunakan instanceof bersama dengan tipe generik yang dihapus .

Misalnya, jika kami mencoba mengompilasi cuplikan berikut:

public static  void sort(List collection) { if (collection instanceof List) { // sort strings differently } // omitted }

Kemudian kami mendapatkan kesalahan kompilasi ini:

error: illegal generic type for instanceof if (collection instanceof List) { ^

Secara teknis, kita hanya diperbolehkan menggunakan instanceof bersama dengan reifiedjenis di Jawa. Suatu tipe direifikasi jika informasi tipenya ada pada saat runtime.

Jenis yang direifikasi di Jawa adalah sebagai berikut:

  • Tipe primitif seperti int
  • Kelas dan antarmuka non-generik seperti String atau Random
  • Tipe umum di mana semua tipe adalah karakter bebas tak terbatas seperti Set atau Peta
  • Jenis mentah seperti List atau HashMap
  • Array jenis lain yang dapat diubah seperti String [], List [], atau Map []

Karena parameter tipe generik tidak direifikasi, kami juga tidak dapat menggunakannya:

public static  boolean isOfType(Object input) { return input instanceof T; // won't compile }

Namun, mungkin untuk menguji sesuatu seperti List :

if (collection instanceof List) { // do something }

7. Kesimpulan

Dalam tutorial ini, kita telah belajar tentang operator instanceof dan bagaimana menggunakannya. Contoh kode lengkap tersedia di GitHub.