Java 10 LocalVariable Type-Inference

Artikel ini adalah bagian dari seri: • Java 10 LocalVariable Type-Inference (artikel saat ini) • Peningkatan Performa Java 10

• Fitur Baru Java 10

1. Ikhtisar

Salah satu peningkatan yang paling terlihat di JDK 10 adalah inferensi tipe variabel lokal dengan penginisialisasi.

Tutorial ini memberikan detail fitur ini dengan contoh.

2. Pendahuluan

Hingga Java 9, kami harus menyebutkan jenis variabel lokal secara eksplisit dan memastikannya kompatibel dengan penginisialisasi yang digunakan untuk memulainya:

String message = "Good bye, Java 9";

Di Java 10, inilah cara kita mendeklarasikan variabel lokal:

@Test public void whenVarInitWithString_thenGetStringTypeVar() { var message = "Hello, Java 10"; assertTrue(message instanceof String); }

Kami tidak menyediakan tipe data pesan . Sebagai gantinya, kita menandai pesan sebagai var , dan kompilator menyimpulkan jenis pesan dari jenis penginisialisasi yang ada di sisi kanan.

Dalam contoh di atas, jenis pesannya adalah String .

Perhatikan bahwa fitur ini hanya tersedia untuk variabel lokal dengan penginisialisasi. Itu tidak dapat digunakan untuk variabel anggota, parameter metode, tipe kembalian, dll - penginisialisasi diperlukan karena tanpanya compiler tidak akan dapat menyimpulkan tipe.

Peningkatan ini membantu dalam mengurangi kode boilerplate; sebagai contoh:

Map map = new HashMap();

Ini sekarang dapat ditulis ulang sebagai:

var idToNameMap = new HashMap();

Ini juga membantu untuk fokus pada nama variabel daripada jenis variabel.

Hal lain yang perlu diperhatikan adalah var bukanlah kata kunci - ini memastikan kompatibilitas mundur untuk program yang menggunakan var katakan, sebagai fungsi atau nama variabel. var adalah nama tipe yang dicadangkan, seperti int .

Terakhir, perhatikan bahwa tidak ada overhead runtime dalam menggunakan var juga tidak membuat Java menjadi bahasa yang diketik secara dinamis. Jenis variabel masih disimpulkan pada waktu kompilasi dan tidak dapat diubah nanti.

3. Penggunaan var secara Ilegal

Seperti yang disebutkan sebelumnya, var tidak akan berfungsi tanpa penginisialisasi:

var n; // error: cannot use 'var' on variable without initializer

Juga tidak akan berhasil jika diinisialisasi dengan null :

var emptyList = null; // error: variable initializer is 'null'

Ini tidak akan berfungsi untuk variabel non-lokal:

public var = "hello"; // error: 'var' is not allowed here

Ekspresi lambda membutuhkan tipe target eksplisit, dan karenanya var tidak dapat digunakan:

var p = (String s) -> s.length() > 10; // error: lambda expression needs an explicit target-type

Sama halnya dengan penginisialisasi array:

var arr = { 1, 2, 3 }; // error: array initializer needs an explicit target-type

4. Panduan Penggunaan var

Ada situasi di mana var dapat digunakan secara legal, tetapi mungkin bukan ide yang baik untuk melakukannya.

Misalnya, dalam situasi di mana kode menjadi kurang dapat dibaca:

var result = obj.prcoess();

Di sini, meskipun penggunaan var legal , menjadi sulit untuk memahami tipe yang dikembalikan oleh proses () membuat kode kurang dapat dibaca.

java.nethas adalah artikel khusus tentang Panduan Gaya untuk Inferensi Jenis Variabel Lokal di Java yang membahas tentang bagaimana kita harus menggunakan penilaian saat menggunakan fitur ini.

Situasi lain yang paling baik untuk menghindari var adalah di aliran dengan pipa yang panjang:

var x = emp.getProjects.stream() .findFirst() .map(String::length) .orElse(0);

Penggunaan var juga dapat memberikan hasil yang tidak diharapkan.

Misalnya, jika kita menggunakannya dengan operator berlian yang diperkenalkan di Java 7:

var empList = new ArrayList();

Jenis empList adalah ArrayList dan bukan List . Jika kita menginginkannya menjadi ArrayList , kita harus eksplisit:

var empList = new ArrayList();

Menggunakan var dengan tipe non-denotable dapat menyebabkan error yang tidak terduga.

Misalnya, jika kita menggunakan var dengan instance kelas anonim:

@Test public void whenVarInitWithAnonymous_thenGetAnonymousType() { var obj = new Object() {}; assertFalse(obj.getClass().equals(Object.class)); }

Sekarang, jika kita mencoba untuk menetapkan Objek lain ke obj , kita akan mendapatkan kesalahan kompilasi:

obj = new Object(); // error: Object cannot be converted to 

Hal ini karena jenis disimpulkan dari obj tidak Obyek .

5. Kesimpulan

Pada artikel ini, kami melihat fitur inferensi tipe variabel lokal Java 10 baru dengan contoh.

Seperti biasa, potongan kode dapat ditemukan di GitHub.

Berikutnya » Peningkatan Kinerja Java 10