[Java 10] Tính năng mới của Java 10, Local Variable Type Inference!

Trong tháng 3 vừa rồi,  Oracle vừa ra mắt phiển bản Java 10 tròn trĩnh với những thay đổi đáng chú ý. Một trong  số các thay đổi được quan tâm có lẽ phổ biến nhất và hữu ích nhất đó là  việc giới thiệu từ khóa var (và lưu ý rằng chúng ta hiểu nó như một từ khóa nhưng nó không là một từ khóa trong java, nó là một reserved type name – tên dành riêng) trong Java.

Các tính năng cần quan tâm và được chú ý được đề cập trong Java 10;

Features

286: Local-Variable Type Inference
296: Consolidate the JDK Forest into a Single Repository
304: Garbage-Collector Interface
307: Parallel Full GC for G1
310: Application Class-Data Sharing
312: Thread-Local Handshakes
313: Remove the Native-Header Generation Tool (javah)
314: Additional Unicode Language-Tag Extensions
316: Heap Allocation on Alternative Memory Devices
317: Experimental Java-Based JIT Compiler
319: Root Certificates
322: Time-Based Release Versioning

Local-Variable Type Inference trong Java 10
Local-Variable Type Inference trong Java 10

Trong bài viết này tôi sẽ đề cập đến tính năng :

Local-Variable Type Inference trong Java 10

Theo như một số chuyên gia và luôn theo giỏi những thay đổi của Java oracle trong các version thì có một số bài viết nói rằng var đã xuất hiện trên Java 9 nhưng sau đó bị loại bỏ. Và sau tất cả  Java cũng có từ khóa var để khai báo các biến, cho phép bạn khai báo một biến không có kiểu dữ liệu của chúng.Ví dụ thay vì code String java= “Java”, bạn có thể  khai báo và nói với Java rằng var java= “Java” . Điều này có lẽ một số bạn đang tự hỏi nó có thực sự hữu dụng? Khi thay vì code int number = 5, thì code var number = 5. chẳng khác gì nhau nhiều. Tuy nhiên có lẽ nó hữu ích khi các bạn sử dụng  với generics phức tạp.

Cũng có lý do chúng ta nói rằng code sẽ đẹp hơn, khi bố trí các biến ngay hàng thẳng lối.

var k = 1;
var t = 2;
var arrInt = new int[]{ 1 , 2 };

Các nhà phát triển Java từ lâu đã phàn nàn về mã boilerplate và các nghi lễ liên quan đến việc viết mã. Nhiều thứ chỉ mất 5 phút bằng các ngôn ngữ như Python , Groovy hoặc JavaScript có thể mất hơn 30 phút Java vì tính chất của nó.

Nếu bạn đã mã hóa trong Scala, Kotlin, Go, C # hoặc bất kỳ ngôn ngữ JVM nào khác thì bạn biết rằng tất cả chúng đều có một số kiểu suy luận kiểu biến cục bộ đã được tích hợp sẵn trong ngôn ngữ.

Ví dụ, JavaScript đã để cho và var , Kotlin có  val  , C # có var vv

Cho đến Java 10, Java là ngôn ngữ duy nhất không có suy luận kiểu biến cục bộ hoặc hỗ trợ cho từ khóa var.

Mặc dù suy luận kiểu đã được cải tiến rất nhiều trong Java 8 với việc giới thiệu biểu thức lambda, tham chiếu phương pháp và Streams, các biến cục bộ vẫn cần phải được khai báo với kiểu thích hợp nhưng bây giờ đã biến mất. Java 10 có một tính năng, JEP 286: Local-Variable Type Inference sẽ cho phép khai báo các biến cục bộ mà không có thông tin kiểu và bằng cách sử dụng từ khóa var.

Ví dụ về  từ khóa var trong Java 10

Dưới đây là một số ví dụ về từ khóa var trong Java 10 :

var java =  "Java 10" ; // kiểu dữ liệu là chuỗi
var  list  =  new ArrayList < String > (); // kiểu dữ liệu //là list
HashMap<String, Integer> map = new HashMap<>();
 
 var x = new HashMap<>(); // chúng ta có thể khai kháo hợp pháp như thế này

 

Việc sử dụng  var cũng làm cho đoạn mã của bạn ngắn gọn, giảm trùng lặp, ví dụ như tên của Lớp có cả ở bên phải và bên trái như sau:

ByteArrayOutputStream bos =  new ByteArrayOutputStream ();

Ở đây ByteArrayOutputStream đang lặp lại hai lần và chúng ta có thể loại bỏ điều đó bằng cách sử dụng tính năng var của Java 10 như được hiển thị dưới đây:

var bos =  new ByteArrayOutputStream ();

 

Trên là một ví dụ điển hình, ngoài ra var còn được sử dụng rất nhiều trong các trường hợp khác nhau để làm cho mã của bạn súc tích, ngắn gọn và dễ đọc hơn.

Cá nhân mình không thích từ khóa var với tính năng này, đơn giản vì nó không tường mình, rõ ràng. Tuy nhiên phải công nhận rằng nó dễ viết, code ngắn gọn đi hơn rất nhiều, nó được thực hiện và có ích rất rõ khi  khởi tạo một đối tượng (Object), làm việc với Generics, hoặc làm việc với các phương thức tĩnh, nơi lớp được bao bọc một cách rõ ràng (Utilities.method()), như vậy Java đang nỗ lực và mong muốn giảm độ dài và cải thiện hiệu quả của  các nhà phát triển .

Một số hạn chế

1) Bạn không thể khởi tạo một biến mà không có giá trị

var x; //Not Ok!!!

2) Bạn không thể khởi tạo nhiều biến

var x = 0, y = 0; // Not OK!

3) Không có giá trị null!

var x = null; //Not OK!

4) Bạn không thể chỉ định lại một kiểu dữ liệu khác

var x = 0; / / giá trị kiểu int
var x = "c"; //Not OK! - kiểu dữ liệu không tương thích!

5) Bạn không thể dùng var để khai báo kiểu dữ liệu trả về cho method.

public var sum(int a, int b) { // Not ok
		return a +b; 
	}

6) Bạn không thể dùng var để khai báo kiểu cho phương thức có tham số.

public int sum(var a, var b) { // Not ok
		return a +b; 
	}

7).Các biến kiểu địa phương hoặc Java 10 , từ khóa var chỉ có thể được sử dụng để khai báo các biến địa phương, ví dụ như  khai báo bên trong các phương thức, và các biến cục bộ được khai báo trong một vòng lặp truyền thống.

public class Java10 {
var xxx = 10; // not ok

public void sum() {
for(var i = 1; i< = 10; i++){ // OK
}
}
}

Những lưu ý trên là những chú ý quan trọng khi sử dụng var trong Java 10, một tính năng Java 10 thú vị cho phép bạn khai báo các biến cục bộ mà không khai báo kiểu dữ liệu của chúng. Điều này cũng sẽ giúp nhà phát triển Java chọn các ngôn ngữ khác nhanh chóng như Python hoặc Kotlin bởi vì họ sử dụng nhiều var , hay val để khai báo các biến có thể thay đổi và val để khai báo các biến cục bộ bất biến. Mặc dù JEP 286: Kiểu biến cục bộ , chỉ hỗ trợ var và không phải val.

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x