Jenis Mentah di Jawa

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat tipe mentah, apa itu, dan mengapa kita harus menghindarinya.

2. Jenis Mentah

Tipe mentah adalah nama untuk antarmuka atau kelas umum tanpa argumen tipenya:

List list = new ArrayList(); // raw type

Dari pada:

List listIntgrs = new ArrayList(); // parameterized type

Daftar adalah jenis antarmuka Daftar berparameter sedangkan Daftar adalah jenis antarmuka mentah Daftar .

Jenis mentah dapat berguna saat berinteraksi dengan kode warisan non-generik.

Namun, jika tidak, itu tidak disarankan. Hal ini karena:

  1. Mereka tidak ekspresif
  2. Mereka kekurangan keamanan tipe, dan
  3. Masalah diamati pada waktu proses dan bukan pada waktu kompilasi

3. Tidak ekspresif

Tipe mentah tidak mendokumentasikan dan menjelaskan dirinya sendiri seperti tipe berparameter.

Kita dapat dengan mudah menyimpulkan bahwa tipe List berparameter adalah daftar yang berisi String . Namun, tipe mentah tidak memiliki kejelasan ini, sehingga sulit untuk bekerja dengannya dan dengan metode API-nya.

Mari kita lihat tanda tangan metode get (int index) di antarmuka Daftar untuk memahami ini lebih baik:

/** * Returns the element at the specified position in this list. * * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException if the index is out of range * (index = size()) */ E get(int index);

Metode get (int index) mengembalikan String pada indeks posisi dalam daftar tipe berparameter .

Namun, untuk List tipe mentah , ia mengembalikan sebuah Objek . Dengan demikian, kita diharuskan untuk melakukan upaya ekstra untuk memeriksa dan mengidentifikasi jenis elemen dalam Daftar tipe mentah dan menambahkan pengecoran jenis yang sesuai. Hal ini dapat menyebabkan bug pada saat dijalankan karena tipe mentah bukanlah tipe yang aman .

4. Tidak Aman Mengetik

Kami mendapatkan perilaku pra-generik dengan tipe mentah. Oleh karena itu, Daftar tipe mentah menerima Objek dan dapat menampung elemen tipe data apa pun . Hal ini dapat menyebabkan masalah keamanan jenis saat kita mencampur jenis parameter dan mentah.

Mari kita lihat ini dengan membuat beberapa kode yang membuat instance List sebelum meneruskannya ke metode yang menerima List tipe mentah dan menambahkan Integer ke dalamnya:

public void methodA() { List parameterizedList = new ArrayList(); parameterizedList.add("Hello Folks"); methodB(parameterizedList); } public void methodB(List rawList) { // raw type! rawList.add(1); }

Kode dikompilasi (dengan peringatan), dan Integer ditambahkan ke Daftar tipe mentah saat dieksekusi. The Daftar yang disahkan sebagai argumen sekarang berisi String dan Integer .

Kompilator mencetak peringatan karena penggunaan tipe mentah:

Note: RawTypeDemo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

5. Masalah saat Runtime

Kurangnya keamanan tipe pada tipe mentah memiliki efek kausal yang dapat menyebabkan pengecualian saat runtime.

Mari kita ubah contoh sebelumnya sehingga methodA mendapatkan elemen pada posisi indeks 1 dari List kita setelah memanggil methodB :

public void methodA() { List parameterizedList = new ArrayList(); parameterizedList.add("Hello Folks"); methodB(parameterizedList); String s = parameterizedList.get(1); } public void methodB(List rawList) { rawList.add(1); }

Kode dikompilasi (dengan peringatan yang sama) dan menampilkan ClassCastException saat dieksekusi. Ini terjadi karena metode get (int index) mengembalikan Integer , yang tidak dapat ditetapkan ke variabel berjenis String :

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

6. Kesimpulan

Jenis mentah sulit untuk dikerjakan dan dapat menimbulkan bug dalam kode kita.

Menggunakannya dapat menyebabkan konsekuensi yang dapat menjadi bencana, dan sayangnya, sebagian besar bencana ini terjadi pada saat berjalan.

Lihat semua cuplikan dalam tutorial ini di GitHub.