1. Gula sintaksis

Pengaturcara suka apabila beberapa kod atau logik kompleks boleh ditulis dalam beberapa baris, menjadikan kod padat dan boleh dibaca. Dan pencipta bahasa pengaturcaraan kadangkala membantu dengan ini.

Ciri bahasa licik yang membolehkan anda mengambil pintasan (tulis kod kurang) dipanggil gula sintaksis . Tetapi, sejujurnya, terdapat sangat sedikit di Jawa.

Pencipta Java melakukan segala yang mereka mampu untuk menghapuskan sebarang lebihan di Jawa. Jika C++ membenarkan anda melakukan sesuatu 20 cara, maka Java membenarkan anda melakukannya hanya dengan satu cara.

Tetapi pengaturcara Java mahupun pencipta Java tidak menyukai kekurangan kebebasan. Dan kadangkala gula menjadikan hidup lebih mudah untuk orang biasa seperti anda dan saya.

Ngomong-ngomong, anda telah menemui beberapa gula sintaksis: autoboxing dan unboxing . Mari bandingkan:

Kod panjang Kod padat
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

Daripada kod panjang seperti di sebelah kiri, anda boleh menulis kod yang lebih padat di sebelah kanan. Dan pengkompil Java pintar akan menjana versi kod bertele-tele berdasarkan versi pendek kod. Inilah sebenarnya gula sintaksis.


2. Inferens jenis pembolehubah: varkata kunci

Dalam Java 11, pengkompil menjadi lebih bijak dan kini boleh menentukan jenis pembolehubah yang diisytiharkan berdasarkan jenis nilai yang diberikan kepadanya . Dalam kod, ia kelihatan seperti ini:

var name = value;

Di manakah namenama pembolehubah baharu, nilai ialah nilai awalnya dan varmerupakan kata kunci yang digunakan untuk mengisytiharkan pembolehubah. Jenis pembolehubah nama akan sama dengan jenis nilai yang diberikan kepadanya.

Contoh:

Bagaimana kita melihat kod itu Apa yang dilihat oleh pengkompil
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

Pengkompil sendiri menentukan, atau membuat kesimpulan, jenis pembolehubah berdasarkan nilai yang diberikan kepadanya.

Pengaturcara berdebat hangat sama ada untuk menambah ciri sedemikian pada bahasa. Ramai orang bimbang ia varakan disalahgunakan dan kebolehbacaan kod akan terjejas akibatnya.

Terdapat butiran kebenaran untuk ini, jadi sebaiknya gunakan vardi mana ia meningkatkan kebolehbacaan kod. Sebagai contoh, ini dalam dua kes:

Kes 1: Melihat pada nilai yang diberikan kepada pembolehubah, jenis pembolehubah jelas serta-merta

Kod Penjelasan
var stream = url.getInputStream();
Pembolehubah ialah aInputStream
var name = person.getFullName();
Pembolehubah ialah aString

Dalam kes ini, anda tidak sepatutnya menggunakan var. Nah, apakah jenis pembolehubah itu?

Kod Penjelasan
var result = task.execute();
Sukar untuk menentukan jenis pembolehubah
var status = person.getStatus();
Sukar untuk menentukan jenis pembolehubah

Kes 2: Jenis pembolehubah tidak penting untuk memahami kod

Kod selalunya tidak perlu memanggil kaedah pada pembolehubah, contohnya apabila pembolehubah hanya digunakan untuk menyimpan sesuatu buat sementara waktu. Dalam kes ini, penggunaan varpasti tidak mengurangkan kebolehbacaan kod:

Kod panjang Kod padat
var data = stream.getMetaData();
storage.save(data)
Kami mendapat metadata daripada streamaliran dan menyimpannya dalam storagerepositori. Jenis khusus pembolehubah datatidak penting.

Maksud emas

Sekarang saya akan memberikan tiga cara untuk menulis kod yang sama. Menggunakan varakan menjadi pilihan terbaik.

Kod Catatan
dest.writeHeaderInfo(src.getFileMetaInfo());
Terlalu padat
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Tepat sekali
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Terlalu terperinci

Bergerak daripada versi dengan 1 baris ke versi pada 2 baris, kami menjadikan kod itu lebih mudah dibaca dengan menggunakan nama pembolehubah ( headerInfo). Kini jelas bahawa kaedah itu tidak hanya mengembalikan maklumat meta, tetapi maklumat pengepala.

Versi ketiga terlalu bertele-tele. Hakikat bahawa headerInfoadalah FileMetaInfosudah agak jelas daripada getFileMetaInfo()kaedah. Tujuan maklumat meta adalah lebih menarik.



3. Mengeluarkan jenis dengan pengendali berlian:<>

Malah sebelum varpengendali muncul, terdapat percubaan untuk mengajar pengkompil cara membuat kesimpulan jenis koleksi. Anda akan bersetuju bahawa notasi ini kelihatan sedikit berlebihan:

ArrayList<String> list = new ArrayList<String>();

Bermula dari versi Java ketujuh, apabila menulis jenis koleksi, anda boleh meninggalkan jenis elemen koleksi jika ia dinyatakan semasa mengisytiharkan pembolehubah. Dengan kata lain, kod di atas boleh ditulis dalam bentuk yang ringkas:

ArrayList<String> list = new ArrayList<>();

Seperti yang anda lihat, anda tidak perlu lagi menulis String untuk kali kedua. Tidak sehebat pengendali var, tetapi ia kelihatan seperti kemajuan pada masa itu.

Tanda kurung sudut kosong dalam jenis koleksi dipanggil pengendali berlian , kerana dua kurungan sudut samar-samar menyerupai berlian.

Adalah tidak diingini untuk menggunakan varkata kunci dan pengendali berlian pada masa yang sama :

var list = new ArrayList<>();

Tiada maklumat sama sekali tentang jenis elemen yang disimpan dalam koleksi, dan jenis koleksi ialah ArrayList < Object >.



4. Pendakap kerinting berganda

Ingat inisialisasi tatasusunan pantas?

Kami hanya menyenaraikan nilai dalam pendakap kerinting, seperti ini:

Contoh
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

Pencipta Java menyukai idea menggunakan pendakap kerinting untuk memudahkan elemen penulisan tatasusunan. Tetapi bagaimana dengan koleksi?

Pencipta Java mempunyai pemikiran kreatif yang mencukupi untuk koleksi juga, membolehkan mereka menggunakan helah dengan pendakap kerinting berganda.

Dengan gula Tanpa gula
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

Jika pengkompil menemui kod seperti dalam contoh di sebelah kiri, maka ia menukarnya kepada kod di sebelah kanan.

Kod tidak menjadi lebih padat. Penjimatan di sini agak kecil: anda tidak perlu menulis listsetiap masa. Ini boleh membantu jika nama pembolehubah sangat panjang.

Tetapi jika anda terjumpa kod seperti ini dalam projek, jangan terkejut 🙂