1. Đường cú pháp

Các lập trình viên thích khi một số mã hoặc logic phức tạp có thể được viết trong một vài dòng, làm cho mã trở nên nhỏ gọn và dễ đọc. Và những người tạo ra ngôn ngữ lập trình đôi khi giúp ích cho việc này.

Một tính năng ngôn ngữ khéo léo cho phép bạn sử dụng phím tắt (viết ít mã hơn) được gọi là đường cú pháp . Nhưng, thành thật mà nói, có rất ít trong Java.

Những người tạo ra Java đã làm mọi thứ có thể để loại bỏ bất kỳ sự dư thừa nào trong Java. Nếu C++ cho phép bạn làm điều gì đó theo 20 cách, thì Java chỉ cho phép bạn làm điều đó theo một cách.

Nhưng cả lập trình viên Java lẫn người tạo ra Java đều không thích sự thiếu tự do. Và đôi khi đường làm cho cuộc sống của những người bình thường như bạn và tôi trở nên dễ dàng hơn.

Nhân tiện, bạn đã gặp một số cú pháp đường: autoboxingunboxing . Hãy so sánh:

mã dài mã nhỏ gọn
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)
{
   ...
}

Thay vì mã dài như bên trái, bạn có thể viết mã ngắn gọn hơn ở bên phải. Và trình biên dịch Java thông minh sẽ tạo ra phiên bản dài dòng của mã dựa trên phiên bản ngắn của mã. Đây chính xác là đường cú pháp.


2. Suy luận kiểu biến: từ varkhóa

Trong Java 11, trình biên dịch thậm chí còn trở nên thông minh hơn và giờ đây có thể xác định loại biến được khai báo dựa trên loại giá trị được gán cho nó . Trong mã, nó trông như thế này:

var name = value;

Đâu namelà tên của một biến mới, value là giá trị ban đầu của nó và varlà một từ khóa được sử dụng để khai báo biến. Kiểu của biến tên sẽ giống với kiểu của giá trị được gán cho nó.

Ví dụ:

Cách chúng tôi nhìn thấy mã Những gì trình biên dịch nhìn thấy
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};

Trình biên dịch tự xác định hoặc suy ra loại biến dựa trên giá trị được gán cho nó.

Các lập trình viên đã tranh luận sôi nổi về việc có nên thêm một tính năng như vậy vào ngôn ngữ hay không. Nhiều người sợ rằng điều đó varsẽ bị lạm dụng và kết quả là khả năng đọc mã sẽ bị ảnh hưởng.

Có một phần sự thật về điều này, vì vậy tốt nhất là sử dụng varở nơi nó làm tăng khả năng đọc mã. Ví dụ, những điều này trong hai trường hợp:

Trường hợp 1: Nhìn vào giá trị gán cho biến là biết ngay kiểu của biến

Mã số Giải trình
var stream = url.getInputStream();
Biến là mộtInputStream
var name = person.getFullName();
Biến là mộtString

Trong những trường hợp này, bạn không nên sử dụng var. Vâng, loại biến là gì?

Mã số Giải trình
var result = task.execute();
Khó xác định loại biến
var status = person.getStatus();
Khó xác định loại biến

Trường hợp 2: Loại của biến không quan trọng để hiểu mã

Mã thường không cần gọi các phương thức trên một biến, ví dụ: khi một biến được sử dụng đơn giản để lưu trữ tạm thời một thứ gì đó. Trong trường hợp này, việc sử dụng varkhông làm giảm khả năng đọc của mã:

mã dài mã nhỏ gọn
var data = stream.getMetaData();
storage.save(data)
Chúng tôi đã lấy siêu dữ liệu từ streamluồng và lưu nó vào storagekho lưu trữ. Loại datacụ thể của biến không quan trọng.

ý nghĩa vàng

Bây giờ tôi sẽ đưa ra ba cách để viết mã giống nhau. Sử dụng varsẽ là lựa chọn tốt nhất.

Mã số Ghi chú
dest.writeHeaderInfo(src.getFileMetaInfo());
Quá nhỏ gọn
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Đúng rồi
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Quá chi tiết

Chuyển từ phiên bản có 1 dòng sang phiên bản có 2 dòng, chúng tôi đã làm cho mã dễ đọc hơn một chút bằng cách sử dụng tên biến ( headerInfo). Bây giờ, rõ ràng là phương thức này không chỉ trả về thông tin meta mà còn cả thông tin tiêu đề.

Phiên bản thứ ba là quá dài dòng. Thực tế headerInfolà a FileMetaInfođã khá rõ ràng từ getFileMetaInfo()phương pháp này. Mục đích của thông tin meta thú vị hơn nhiều.



3. Bỏ loại với toán tử kim cương:<>

Ngay cả trước khi vartoán tử xuất hiện, đã có những nỗ lực dạy trình biên dịch cách suy luận các loại tập hợp. Bạn sẽ đồng ý rằng ký hiệu này có vẻ hơi dư thừa:

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

Bắt đầu từ phiên bản thứ bảy của Java, khi viết một kiểu tập hợp, bạn có thể bỏ qua kiểu của các phần tử tập hợp nếu nó được chỉ định khi khai báo một biến. Nói cách khác, đoạn mã trên có thể được viết dưới dạng viết tắt một chút:

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

Như bạn có thể thấy, bạn không cần phải viết Chuỗi lần thứ hai nữa. Không thú vị như với toán tử var, nhưng có vẻ như nó đã tiến bộ vào thời điểm đó.

Các dấu ngoặc nhọn trống trong loại bộ sưu tập được gọi là toán tử kim cương , vì hai dấu ngoặc góc trông giống một viên kim cương.

varViệc sử dụng từ khóa và toán tử kim cương cùng một lúc là điều không mong muốn :

var list = new ArrayList<>();

Không có thông tin nào về loại phần tử được lưu trữ trong bộ sưu tập và loại bộ sưu tập sẽ là ArrayList < Đối tượng >.



4. Niềng răng kép

Nhớ khởi tạo mảng nhanh chóng?

Chúng tôi chỉ liệt kê các giá trị trong dấu ngoặc nhọn, như thế này:

ví dụ
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

Những người tạo ra Java yêu thích ý tưởng sử dụng dấu ngoặc nhọn để đơn giản hóa việc viết các phần tử của một mảng. Nhưng còn bộ sưu tập thì sao?

Những người tạo ra Java cũng có đủ tư duy sáng tạo cho các bộ sưu tập, cho phép họ sử dụng thủ thuật với dấu ngoặc nhọn kép.

Với đường Không đường
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?");

Nếu trình biên dịch gặp mã như trong ví dụ bên trái, thì nó sẽ chuyển mã đó sang mã bên phải.

Mã không trở nên nhỏ gọn hơn nhiều. Khoản tiết kiệm ở đây là khá nhỏ: bạn không cần phải viết listmọi lúc. Điều này có thể hữu ích nếu tên biến quá dài.

Nhưng nếu bạn bắt gặp mã như thế này trong một dự án, đừng ngạc nhiên 🙂