CodeGym /Java Course /Modul 1 /Ketik inferensi oleh kompiler Java

Ketik inferensi oleh kompiler Java

Modul 1
Level 16 , Pelajaran 5
Tersedia

1. Gula sintaksis

Pemrogram suka ketika beberapa kode atau logika kompleks dapat ditulis dalam beberapa baris, membuat kode menjadi ringkas dan mudah dibaca. Dan pencipta bahasa pemrograman terkadang membantu dalam hal ini.

Fitur bahasa apik yang memungkinkan Anda mengambil jalan pintas (menulis lebih sedikit kode) disebut gula sintaksis . Tapi, sejujurnya, di Jawa sangat sedikit.

Pencipta Java melakukan semua yang mereka bisa untuk menghilangkan redundansi di Jawa. Jika C++ memungkinkan Anda melakukan sesuatu dengan 20 cara, maka Java memungkinkan Anda melakukannya hanya dengan satu cara.

Tetapi baik pemrogram Java maupun pencipta Java tidak menyukai kurangnya kebebasan. Dan terkadang gula membuat hidup lebih mudah bagi orang biasa seperti Anda dan saya.

Omong-omong, Anda telah menemukan beberapa gula sintaksis: autoboxing dan unboxing . Mari kita bandingkan:

Kode panjang Kode ringkas
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)
{
   ...
}

Alih-alih kode panjang seperti di sebelah kiri, Anda dapat menulis kode yang lebih ringkas di sebelah kanan. Dan kompiler Java yang cerdas akan menghasilkan versi kode verbose berdasarkan versi singkat dari kode tersebut. Inilah tepatnya gula sintaksis.


2. Inferensi tipe variabel: kata varkunci

Di Java 11, kompiler menjadi lebih pintar dan sekarang dapat menentukan jenis variabel yang dideklarasikan berdasarkan jenis nilai yang diberikan padanya . Dalam kode, tampilannya seperti ini:

var name = value;

Di mana namenama variabel baru, nilai adalah nilai awalnya, dan varkata kunci yang digunakan untuk mendeklarasikan variabel. Jenis variabel nama akan sama dengan jenis nilai yang diberikan padanya.

Contoh:

Bagaimana kita melihat kodenya Apa yang dilihat oleh kompiler
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};

Kompiler itu sendiri menentukan, atau menyimpulkan, tipe variabel berdasarkan nilai yang diberikan padanya.

Pemrogram memperdebatkan dengan panas apakah akan menambahkan fitur seperti itu ke bahasa. Banyak orang takut itu varakan disalahgunakan dan sebagai akibatnya keterbacaan kode akan terganggu.

Ada sedikit kebenaran untuk ini, jadi yang terbaik adalah menggunakan varyang meningkatkan keterbacaan kode. Misalnya, ini dalam dua kasus:

Kasus 1: Melihat nilai yang diberikan ke variabel, tipe variabel langsung jelas

Kode Penjelasan
var stream = url.getInputStream();
Variabelnya adalah sebuahInputStream
var name = person.getFullName();
Variabelnya adalah aString

Dalam kasus ini, Anda tidak boleh menggunakan var. Nah, apa jenis variabelnya?

Kode Penjelasan
var result = task.execute();
Sulit untuk menentukan jenis variabel
var status = person.getStatus();
Sulit untuk menentukan jenis variabel

Kasus 2: Jenis variabel tidak penting untuk memahami kode

Kode seringkali tidak perlu memanggil metode pada variabel, misalnya ketika variabel hanya digunakan untuk menyimpan sesuatu untuk sementara. Dalam hal ini, menggunakan varpasti tidak mengurangi keterbacaan kode:

Kode panjang Kode ringkas
var data = stream.getMetaData();
storage.save(data)
Kami mendapat metadata dari streamaliran dan menyimpannya di storagerepositori. Jenis spesifik variabel datatidak penting.

Makna emas

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

Kode Catatan
dest.writeHeaderInfo(src.getFileMetaInfo());
Terlalu kompak
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Tepat
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Terlalu detail

Pindah dari versi dengan 1 baris ke versi dengan 2 baris, kami membuat kode sedikit lebih mudah dibaca dengan menggunakan nama variabel ( headerInfo). Sekarang sudah jelas bahwa metode mengembalikan bukan hanya informasi meta, tetapi juga informasi header.

Versi ketiga terlalu bertele-tele. Fakta bahwa headerInfoa FileMetaInfosudah cukup jelas dari metodenya getFileMetaInfo(). Tujuan dari informasi meta jauh lebih menarik.



3. Menghilangkan tipe dengan operator berlian:<>

Bahkan sebelum varoperator muncul, ada upaya untuk mengajari kompiler cara menyimpulkan tipe koleksi. Anda akan setuju bahwa notasi ini terlihat sedikit berlebihan:

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

Mulai dari versi ketujuh Java, saat menulis tipe koleksi, Anda bisa menghilangkan tipe elemen koleksi jika ditentukan saat mendeklarasikan variabel. Dengan kata lain, kode di atas dapat ditulis dalam bentuk yang sedikit disingkat:

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

Seperti yang Anda lihat, Anda tidak perlu lagi menulis String untuk kedua kalinya. Tidak sekeren dengan operator var, tapi sepertinya kemajuan saat itu.

Kurung sudut kosong dalam tipe koleksi disebut operator berlian , karena dua kurung sudut secara samar menyerupai berlian.

Tidak diinginkan untuk menggunakan varkata kunci dan operator intan secara bersamaan :

var list = new ArrayList<>();

Tidak ada informasi sama sekali tentang jenis elemen yang disimpan dalam koleksi, dan jenis koleksinya adalah ArrayList < Object >.



4. Kurung kurawal ganda

Ingat inisialisasi larik cepat?

Kami baru saja mencantumkan nilai dalam kurung kurawal, 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 ide menggunakan kurung kurawal untuk menyederhanakan penulisan elemen array. Tapi bagaimana dengan koleksi?

Pembuat Java juga memiliki pemikiran kreatif yang cukup untuk koleksi, memungkinkan mereka menggunakan trik dengan kurung kurawal ganda.

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 kompiler menemukan kode seperti pada contoh di sebelah kiri, maka ia mengubahnya menjadi kode di sebelah kanan.

Kode tidak menjadi jauh lebih kompak. Penghematan di sini cukup kecil: Anda tidak perlu menulis listsetiap saat. Ini dapat membantu jika nama variabel sangat panjang.

Tetapi jika Anda menemukan kode seperti ini dalam sebuah proyek, jangan kaget 🙂


Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION