Local class là các class được định nghĩa bên trong một block. block là một nhóm các câu lệnh nằm giữa cặp dấu “{}”. Thông thường local class được bên trong một hàm.
Khai báo Local class
Bạn có thể khai báo một local class trong bất kỳ một block nào( Expressions, Statements, Blocks). Ví dụ về local class được định nghĩa trong một hàm.
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { private static final String EMAIL_REGEX = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$"; public static void validateEmail(String emailParam) { int maxLength = 50; class Email { private String email = null; Email(String email) { if (validate(email)) { this.email = email; } } public boolean validate(String email) { if (email.length() > maxLength) { return false; } Pattern pattern = Pattern.compile(EMAIL_REGEX, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(email); return matcher.find(); } public void printEmail() { System.out.println(emailParam); } public String getEmail() { return email; } } Email emailValidate = new Email(emailParam); // emailValidate.printEmail(); if (emailValidate.getEmail() == null) { System.out.println(emailParam + " Khong hop le"); } else { System.out.println(emailParam + " Hop le"); } } public static void main(String[] args) { validateEmail("[email protected]"); } }
Output: [email protected] Hop le |
Đặc điểm của local class
Local class là một dạng đặc biệt của Inner class, vì vậy nó cũng có đầy đủ tính chất của một Inner class.
Truy cập các thành phần của lớp chứa nó. Ở ví dụ trên hàm validate() của class Email đã truy cập EMAIL_REGEX của class Main.
Local class cũng có thể truy cập thành phần của khối chứa nó. Ví dụ hàm validate() đã truy cập maxLength của hàm validateEmail chứa nó.
Từ Java 8 trở đi, Local class có thể truy cập được tham số đầu vào của block chứa nó, Xem hàm printEmail()
Local class là một class non-static nên bạn sẽ không thể khai báo các thành phần static bên trong local class. Cho ví dụ, Thay đổi thuộc tính email trong class Email thành static
private static String email = null;
Trình biên dịch sẽ báo lỗi static không được phép khai báo bên trong local class.
Interface bản chất là static class nên interface cũng không được cho phép trong local class.
Một local class có thể có thể chứa các biến static final. Cho ví dụ
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void exampleStaticAcceptLocalClass() { class LocalClass { public static final String staticMember = "Static member"; public void print() { System.out.println(staticMember); } } LocalClass myLocalClass = new LocalClass(); myLocalClass.print(); } public static void main(String[] args) { exampleStaticAcceptLocalClass(); } }
Output: Static member |
Các bạn có thể tải code demo tại đây để chạy kiểm chứng các tính chất của local class.
Nguồn tham khảo
https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html