Bài 2.7: Kiểu tự suy luận
Nội dung bài học
Khái niệm
- Kiểu tự suy luận là kiểu dữ liệu của một biến được chương trình Java tự động xác định dựa trên giá trị mà ta gán cho biến.
- Kiểu tự suy luận trong Java được khai báo với keyword var.
- Ví dụ:
var name = "Thanh Pham"; // kiểu của name là String
var x = 100; // kiểu của x là int
var f = 3.125f; // kiểu của f là float
var d = 5.687; // kiểu của d là double
var other = true; // kiểu của other là boolean
Cú pháp
- Cú pháp tổng quát của khai báo: var name = value;
- Trong đó:
- var là keyword
- Name là tên biến, đặt theo quy tắc đặt tên biến
- Trong khai báo bắt buộc phải có thao tác khởi tạo giá trị
- Value là giá trị gán cho biến. Chương trình sẽ dựa vào giá trị này để xác định kiểu cho biến.
- Các giới hạn:
- Chỉ khai báo duy nhất 1 biến với 1 keyword var.
- Bắt buộc phải khởi tạo giá trị cho biến ngay sau khi ta khai báo biến với keyword var.
- Giá trị khởi tạo bắt buộc phải khác null. Nếu bạn gán giá trị null, chương trình sẽ báo lỗi vì giá trị null không đủ thông tin để xác định kiểu của biến.
- Không được chứa tham chiếu đến chính nó trong khi khởi tạo giá trị.
- Không được khai báo biến kiểu mảng với var.
- Không được gán cú pháp khởi tạo mảng cho biến của var.
- Không sử dụng var như là kiểu trả về của phương thức(học sau).
- Không sử dụng var làm kiểu của tham số(học sau).
- Sau khi khai báo biến với var thì kiểu của biến không thể thay đổi. Nhưng giá trị của biến có thể thay đổi.
- Ví dụ:
var scanner = new Scanner(System.in);
var age = scanner.nextInt();
var fullName = scanner.nextLine();
var address = scanner.nextLine();
var gpa = scanner.nextFloat();
var pi = scanner.nextDouble();
var email = "abc@xmail.com"; // ok
var temperature = 15.25f; // ok
- Làm như sau sẽ gây lỗi:
var arr[] = new int[10]; // error: khai báo kiểu mảng với var
var y = (y = 99); // error: chứa cú pháp tự tham chiếu trong ()
var something = {1, 2, 3}; // không hợp lệ vì chứa cú pháp khởi tạo mảng
var b = null; // không thể xác định được kiểu dữ liệu từ giá trị null
- Để kiểm tra kiểu của một biến sau khi tạo biến với var, ta dùng cú pháp:
System.out.println(((Object)name).getClass().getName());
- Trong đó name là tên biến cần kiểm tra.
- Kết quả sẽ cho chúng ta tên lớp bao của kiểu tương ứng nếu kiểu của name là nguyên thủy. Và tên kiểu của biến name nếu kiểu nó không phải kiểu nguyên thủy.
- Ta có thể sử dụng keyword var để khai báo hằng số cục bộ:
final var MAX_AGE = 125; // hằng số kiểu int
final var MAX_LENGTH = 50L; // hằng số kiểu long
final var MAX_GPA = 4.0; // hằng số kiểu double
Sử dụng trong trường hợp nào?
- Ta thường sử dụng keyword var để khai báo các biến cục bộ.
- Biến cục bộ là biến khai báo trong một khối code ví dụ trong một phương thức, vòng lặp, cấu trúc ra quyết định, biểu thức lambda.
- Có thể dùng để thay thế các kiểu tường minh trong cú pháp khai báo biến mà có khởi tạo.
- Khi kiểu dữ liệu của biến không được biết trước.
- Ví dụ sử dụng trong vòng lặp:
/**
* Tính tổng các số nguyên tố trong mảng.
*
* @param numbers mảng chứa các giá trị số cần tính tổng.
* @return giá trị tổng thỏa mãn.
*/
private static long sumPrimeNumber(int[] numbers) {
var sum = 0;
for (var number : numbers) { // sử dụng kiểu tự suy luận var
if (isPrime(number)) {
sum += number;
}
}
return sum;
}
- Ví dụ sử dụng trong phương thức:
/**
* Phương thức kiểm tra số cho trước có phải là số nguyn tố hay không.
* Cách thức kiểm tra: nếu trong đoạn [2, [căn n]] mà có ước số thì n không
* phải là số nguyên tố.
*
* @param number số cần kiểm tra tính nguyên tố.
* @return true nếu number là số nguyên tố và false trong trường hợp ngược lại.
*/
private static boolean isPrime(int number) {
if (number < 2) { // số nhỏ hơn 2 KHÔNG bao giờ là số nguyên tố
return false;
}
// xét biên là phần nguyên căn bậc hai của n
var bound = (int) Math.sqrt(number);
// nếu n có ước số trong đoạn từ 2 -> bound
for (var i = 2; i <= bound; i++) {
if (number % i == 0) // thì n không phải số nguyên tố
return false;
}
return true; // nếu ko return ở trên thì n là nguyên tố
}
Ví dụ minh họa
import java.util.Scanner;
public class Lesson27 {
public static void main(String[] args) {
var name = "Thanh Pham"; // kiểu của name là String
var x = 100; // kiểu của x là int
var f = 3.125f; // kiểu của f là float
var d = 5.687; // kiểu của d là double
var other = true; // kiểu của other là boolean
var input = new Scanner(System.in); // ok
// var a; // không hợp lệ vì thiếu cú pháp khởi tạo
// var b = null; // không hợp lệ vì không thể xác định kiểu với giá trị null
// var p = 3.14, q = 20; // không hợp lệ vì khai báo nhiều hơn 1 biến
// var arr[] = new int[10]; // không hợp lệ vì khai báo kiểu mảng với var
// var y = (y = 99); // Không hợp lệ vì chứa cú pháp tự tham chiếu trong ()
// var something = {1, 2, 3}; // không hợp lệ vì chứa cú pháp khởi tạo mảng
System.out.println(((Object)input).getClass().getName());
}
}