Java 10 Local-Variable Jenis-Inferens

Artikel ini adalah sebahagian daripada siri: • Java 10 LocalVariable Type-Inference (artikel semasa) • Peningkatan Prestasi Java 10

• Java 10 Ciri Baru

1. Gambaran keseluruhan

Salah satu peningkatan yang paling ketara dalam JDK 10 adalah jenis inferens pemboleh ubah tempatan dengan inisialisasi.

Tutorial ini memberikan perincian ciri ini dengan contoh.

2. Pengenalan

Sehingga Java 9, kita harus menyebut jenis pemboleh ubah tempatan secara eksplisit dan memastikannya sesuai dengan pemula yang digunakan untuk menginisialisasi:

String message = "Good bye, Java 9";

Di Java 10, ini adalah bagaimana kita dapat menyatakan pemboleh ubah tempatan:

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

Kami tidak memberikan jenis data mesej . Sebagai gantinya, kami menandakan mesej sebagai var , dan penyusun memasukkan jenis mesej dari jenis pemula yang ada di sebelah kanan.

Dalam contoh di atas, jenis mesej adalah String .

Perhatikan bahawa ciri ini hanya tersedia untuk pemboleh ubah tempatan dengan penginisialisasi. Ia tidak dapat digunakan untuk pemboleh ubah anggota, parameter metode, jenis pengembalian, dll - penginisialisasi diperlukan kerana tanpa penyusun yang tidak akan dapat menyimpulkan jenisnya.

Peningkatan ini membantu mengurangkan kod plat boiler; sebagai contoh:

Map map = new HashMap();

Sekarang ini boleh ditulis semula sebagai:

var idToNameMap = new HashMap();

Ini juga membantu memberi tumpuan kepada nama pembolehubah dan bukannya pada jenis pemboleh ubah.

Perkara lain yang perlu diperhatikan ialah var bukan kata kunci - ini memastikan keserasian kebelakang untuk program yang menggunakan var say, sebagai fungsi atau nama pemboleh ubah. var adalah nama jenis yang dikhaskan, seperti int .

Akhirnya, perhatikan bahawa tidak ada overtime runtime dalam menggunakan var dan juga tidak menjadikan Java sebagai bahasa yang dinaip secara dinamik. Jenis pemboleh ubah masih dapat disimpulkan pada waktu kompilasi dan tidak dapat diubah kemudian.

3. Penggunaan var secara haram

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

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

Ia juga tidak akan berfungsi jika dimulakan dengan nol :

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

Ia tidak akan berfungsi untuk pemboleh ubah bukan tempatan:

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

Ekspresi lambda memerlukan jenis sasaran yang jelas, dan karenanya var tidak dapat digunakan:

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

Begitu juga dengan pemula array:

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

4. Garis Panduan Penggunaan var

Terdapat situasi di mana var boleh digunakan secara sah, tetapi mungkin bukan idea yang baik untuk melakukannya.

Contohnya, dalam keadaan di mana kodnya menjadi kurang mudah dibaca:

var result = obj.prcoess();

Di sini, walaupun penggunaan var yang sah , menjadi sukar untuk memahami jenis yang dikembalikan oleh proses () menjadikan kod kurang dapat dibaca.

java.nethasalah artikel khusus mengenai Garis Panduan Gaya untuk Inferens Jenis Pembolehubah Tempatan di Java yang membincangkan bagaimana kita harus menggunakan pertimbangan semasa menggunakan fitur ini.

Situasi lain di mana yang terbaik untuk mengelakkan var adalah dalam aliran dengan saluran paip yang panjang:

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

Penggunaan var juga boleh memberikan hasil yang tidak dijangka.

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

var empList = new ArrayList();

Jenis empList adalah ArrayList dan bukan List . Sekiranya kita mahu menjadi ArrayList , kita harus jelas:

var empList = new ArrayList();

Menggunakan var dengan jenis yang tidak dapat dilambangkan boleh menyebabkan kesalahan yang tidak dijangka.

Sebagai contoh, jika kita menggunakan var dengan contoh kelas tanpa nama:

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

Sekarang, jika kita cuba untuk menetapkan lain Objek untuk obj , kita akan mendapat ralat kompilasi:

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

Ini kerana jenis obj yang disimpulkan bukan Objek .

5. Kesimpulan

Dalam artikel ini, kami melihat ciri inferensi jenis pemboleh ubah tempatan Java 10 baru dengan contoh.

Seperti biasa, coretan kod boleh didapati di GitHub.

Seterusnya » Peningkatan Prestasi Java 10