Toán tử instanceof trong Java là một toán tử được sử dụng để kiểm tra xem đối tượng này có phải là instance của một class hay interface nào đó hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đó là thể hiện của class mà các bạn đang check, ngược lại thì false.
Ví dụ, mình có một class Application như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Application application = new Application(); System.out.println(application instanceof Application); } } |
Trong hàm main() của class này, mình initialize một đối tượng của class Application và sử dụng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? Các bạn sẽ thấy kết quả sẽ như sau:
Nếu các bạn viết code như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Application application = new Application(); System.out.println(application instanceof String); } } |
thì IDE sẽ báo lỗi ngay:
Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho các bạn biết ngay.
Nhưng nếu bạn có một interface với hai implementation như sau:
1 2 3 4 5 |
package com.huongdanjava.java; public interface Shape { } |
1 2 3 4 5 |
package com.huongdanjava.java; public class Triangle implements Shape { } |
1 2 3 4 5 |
package com.huongdanjava.java; public class Rectangle implements Shape { } |
thì lúc này nếu các bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Shape shape = new Triangle(); System.out.println(shape instanceof Rectangle); } } |
IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy các bạn sẽ thấy kết quả như sau:
Chúng ta sẽ thường sử dụng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của một phương thức có phải là instance của một class nào đó hay không? Ví dụ như:
1 2 3 4 5 6 7 |
private void check(Shape shape) { if (shape instanceof Triangle) { Triangle triangle = (Triangle) shape; System.out.println("This is triangle: " + triangle.toString()); } } |
Trong phương thức trên, tham số interface Shape có nhiều implementation khác nhau, trong phần body của phương thức, chúng ta sẽ check xem là instance được truyền vào phương thức này có phải là Triangle hay không? Nếu đúng thì xử lý code tiếp.
Kết quả:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.huongdanjava.java; public class Application { private void check(Shape shape) { if (shape instanceof Triangle) { Triangle triangle = (Triangle) shape; System.out.println("This is triangle: " + triangle.toString()); } } public static void main(String[] args) { Application application = new Application(); application.check(new Triangle()); } } |
Từ Java 14, các bạn có thể viết lại phương thức check() sử dụng pattern matching instanceof, đơn giản như sau:
1 2 3 4 5 |
private void check(Shape shape) { if (shape instanceof Triangle triangle) { System.out.println("This is triangle: " + triangle.toString()); } } |
Với cách viết mới, chúng ta không cần viết thêm một dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.
Kết quả vẫn như vậy: