1. Gambaran keseluruhan
Seperti namanya, kelas pembungkus adalah objek merangkumi jenis Java primitif.
Setiap primitif Java mempunyai pembungkus yang sesuai:
- boolean, byte, pendek, char, int, long, float, double
- Boolean, Byte, Short, Character, Integer, Long, Float, Double
Ini semua ditentukan dalam pakej java.lang , oleh itu kita tidak perlu mengimportnya secara manual.
2. Kelas Pembungkus
"Apa tujuan kelas pembungkus?". Ini adalah salah satu soalan wawancara Java yang paling biasa.
Pada dasarnya, kelas generik hanya berfungsi dengan objek dan tidak menyokong primitif . Akibatnya, jika kita ingin bekerjasama dengan mereka, kita harus menukar nilai primitif menjadi objek pembungkus.
Sebagai contoh, Java Collection Framework berfungsi dengan objek secara eksklusif. Sudah lama ketika (sebelum Java 5, hampir 15 tahun yang lalu) tidak ada autoboxing dan kita, misalnya, tidak dapat memanggil add (5) pada koleksi Integers.
Pada masa itu, nilai primitif tersebut perlu ditukar secara manual ke kelas pembungkus yang sesuai dan disimpan dalam koleksi.
Hari ini, dengan autoboxing, kita boleh melakukan ArrayList.add (101) tetapi secara dalaman Java menukarkan nilai primitif kepada Integer sebelum menyimpannya dalam ArrayList menggunakan valueOf () kaedah .
3. Penukaran Kelas Primitif ke Wrapper
Sekarang persoalan besarnya adalah: bagaimana kita mengubah nilai primitif ke kelas pembungkus yang sesuai, misalnya int ke Integer atau char ke Character?
Kita boleh menggunakan kaedah konstruktor atau kilang statik untuk menukar nilai primitif ke objek kelas pembungkus.
Namun demikian, pada Java 9, pembangun untuk banyak primitif berkotak seperti Integer atau Long sudah tidak digunakan lagi.
Oleh itu, sangat digalakkan menggunakan kaedah kilang hanya pada kod baru .
Mari kita lihat contoh menukar nilai int ke objek Integer di Java:
Integer object = new Integer(1); Integer anotherObject = Integer.valueOf(1);
Kaedah valueOf () mengembalikan instance yang mewakili nilai int yang ditentukan .
Ia mengembalikan nilai cache yang menjadikannya cekap. Ia selalu menyimpan nilai antara -128 hingga 127 tetapi juga dapat menyimpan nilai lain di luar julat ini.
Begitu juga, kita juga dapat mengubah boolean menjadi Boolean, byte ke Byte, char ke Character, long to Long, float to Float, dan double to Double. Walaupun jika kita harus mengubah String menjadi Integer maka kita perlu menggunakan metode parseInt () kerana String bukan kelas pembungkus.
Sebaliknya, untuk menukar dari objek pembungkus ke nilai primitif, kita dapat menggunakan kaedah yang sesuai seperti intValue (), doubleValue () dll:
int val = object.intValue();
Rujukan yang komprehensif boleh didapati di sini.
4. Autoboxing dan Unboxing
Pada bahagian sebelumnya, kami menunjukkan cara mengubah nilai primitif secara manual ke objek.
Selepas Java 5, penukaran ini dapat dilakukan secara automatik dengan menggunakan fitur yang disebut autoboxing dan unboxing.
"Tinju" merujuk pada mengubah nilai primitif menjadi objek pembungkus yang sesuai. Kerana ini boleh berlaku secara automatik, ia dikenali sebagai autoboxing.
Begitu juga, apabila objek pembungkus dibungkus ke nilai primitif maka ini dikenali sebagai unboxing.
Apa artinya ini dalam praktiknya ialah kita dapat memberikan nilai primitif kepada kaedah yang mengharapkan objek pembungkusatau menetapkan primitif kepada pemboleh ubah yang menjangkakan objek:
List list = new ArrayList(); list.add(1); // autoboxing Integer val = 2; // autoboxing
Dalam contoh ini, Java secara automatik akan menukar nilai int primitif ke pembungkus.
Secara dalaman, ia menggunakan kaedah valueOf () untuk memudahkan penukaran. Contohnya, baris berikut adalah setara:
Integer value = 3; Integer value = Integer.valueOf(3);
Walaupun ini menjadikan penukaran mudah dan kod lebih mudah dibaca, ada beberapa kes di mana kita tidak boleh menggunakan autoboxing misalnya di dalam satu gelung .
Sama seperti autoboxing, unboxing dilakukan secara automatik ketika meneruskan objek ke kaedah yang mengharapkan primitif atau ketika menetapkannya ke variabel primitif:
Integer object = new Integer(1); int val1 = getSquareValue(object); //unboxing int val2 = object; //unboxing public static int getSquareValue(int i) { return i*i; }
Pada dasarnya, jika kita menulis kaedah yang menerima nilai primitif atau objek pembungkus, kita masih boleh meneruskan kedua-dua nilai tersebut. Java akan menjaga jenis yang tepat seperti primitif atau pembungkus bergantung pada konteksnya.
5. Kesimpulan
Dalam tutorial ringkas ini, kami membincangkan kelas pembungkus di Java, serta mekanisme autoboxing dan unboxing.