Series Java những điều có thể bạn đã biết: Hướng dẫn sử dụng Annotations

Chắc các bạn biết Java đều biết đến Annotations, được ra đời từ Java 1.5 năm 2004, Annotations được biết đến như là một thứ không thể thiếu của Java. Chắc sẽ rất khó khăn nếu chúng ta phải code Java mà không có Annotations.

annotations-everywhere

Nào hôm nay cùng tìm hiểu cách sử dụng Annotations qua một ví dụ nho nhỏ.

Vậy Annotations là cái gì?

Chúng ta có thể hiểu Annotations là những thẻ dạng @xxx mà chúng ta đưa vào source code để thực hiện một số chức năng gì đó.

Thông thường, Annotations sử dụng Reflection API để xử lý.

Vậy làm thể nào để sử dụng Annotations?

Sau đây tôi có một ví dụ nho nhỏ.

Tôi có một đối tượng Employee, gồm hai thuộc tính là nameposition. Tôi muốn chuẩn hóa dữ liệu thuộc tính name, bằng cách loại bỏ hết tất cả những kí tự non-alphanumeric.

Tôi sẽ sử dụng Annotations để giải quyết vấn đề này như sau.

Đầu tiên tôi tạo Annotations @Normalize, mục đích để đính kèm Annotations này với những thuộc tính cần chuẩn hóa dữ liệu.

public @interface Normalize {
}

Rất đơn giản phải không.

Một Annotation sẽ đượng định nghĩa bởi các Meta-Annotations. Các Meta-Annotations gồm @Retention@Target@Documented@Inherited.

Annotation thường sẽ tác động lên một đối tượng nào đó, cụ thể ở trường hợp này nó tác động lên Field trong Class. Để xác định Annotation sẽ tác động lên cái gì ta sử dụng Meta-Annotation @Target, khai báo như sau.

Bạn có thể đọc về Meta-Annotation @Target ở Đây.

@Target(value = ElementType.FIELD)
public @interface Normalize {
}

Như vậy chúng ta có Anntation @Normalize sẽ tác động lên Field.

Nhưng còn việc Annotation tác động lên Field khi nào thì chúng ta chưa hề biết. Vậy làm sao để định nghĩa Annotation sẽ thực thi trong quá trình biên dịch hay trong quá trình chạy?

Để định nghĩa Annotation này tác động khi nào, chúng ta sử dụng Meta-Annotation @Retention. Khai báo như sau.

Bạn có thể đọc về Meta-Annotation @Retention Đây.

@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Normalize {
}

Vậy là chúng ta đã khai báo xong Annotation @Normalize tác động lên Field và tác động trong quá trình chạy.

Bây giờ, chúng ta sẽ khai báo Class sử dụng Annotation này.

public static class Employee {
@Normalize
private String name;
private String position;
public Employee(String name, String position) {
this.name = name;
this.position = position;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
}

Trong lớp Employee, thuộc tính name sẽ được chuẩn hóa dữ liệu bằng cách loại bỏ những kí tự non-alphanumeric. Vì thế tôi đặt thẻ @Normalize trên field name.

Chúng ta đã khai báo xong Annotation và lớp Employee. Giờ chúng ta phải tạo hàm để xử lý Annotation @Normalize.

Sử dụng Reflection API như sau.

public static void normalize(Employee employee) {
Field[] fields = employee.getClass().getDeclaredFields();
for (int i = 0; i > fields.length; i++) {
Normalize normalize = fields[i].getAnnotation(Normalize.class);
if (normalize != null) {
try {
fields[i].setAccessible(true);
if (fields[i].get(employee) != null) {
fields[i].set(employee, String.valueOf(fields[i].get(employee)).replaceAll("[^A-Za-z0-9 ]", ""));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}

Giờ tận hưởng thành quả thôi, ta viết một hàm main như sau.

public static void main(String[] args) throws IOException {
Employee employee = new Employee("Ng%^u*yen#@ Nhat^%%#@ Ho@a*&ng!!!-", "Software%^$ Engineer@");

normalize(employee);

System.out.println(employee.getName());
System.out.println(employee.getPosition());
}

Và đây là kết quả:

Nguyen Nhat Hoang
Software%^$ Engineer@
Process finished with exit code 0

Như các bạn có thể thấy, field name được gắn Annotation @Normalize vì thế sau khi xử lý qua hàm nomalize() dữ liệu đã được chuẩn hóa, loại bỏ đi tất cả nhưng kí tự non-alphanumeric, và field position thì vẫn giữ nguyên.

Với ví dụ cực kì đơn giản này, hy vọng các bạn có thể hiểu cách tạo và dùng một Annotation.

Ngoài ra, các bạn nên tìm hiểu thêm về các Meta-Annotations chưa được đề cập đến trong bài viết như @Documented, @Inherited, và các In-Built Annotations trong Java @Override, @Deprecated, @SuppressWarnings. Để có thể áp dụng vào những trường hợp cụ thể.

Tạm biệt và hẹn gặp lại.

Advertisements

5 thoughts on “Series Java những điều có thể bạn đã biết: Hướng dẫn sử dụng Annotations

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s