java8

Series Java những điều có thể bạn đã biết: Java 8 Repeating Annotations

Tiếp tục Series Java những điều có thể bạn đã biết, trong bài trước các bạn đã được Hướng dẫn sử dụng Annotations, hôm nay tôi sẽ giới thiệu một chức năng mới trong Java 8 cũng liên quan đến cấu trúc Annotations, đó là Repeating Annotations.

Thoạt nghe Repeating Annotations, chúng ta có thể tạm hiểu ý nghĩ của nó là Annotation được lặp lại nhiều lần.

repeat

Vậy cụ thể ý nghĩa của Repeating Annotations là gì?

Trong Java 8, nhà phát triển đã đưa ra khái niện Repeating Annotaions, để phục vụ cho việc các Annotation giống nhau có thể được đặt bao nhiêu tùy thích trong cùng một đoạn code.

Hãy cùng nhìn qua đoạn code bên dưới. Đoạn code này được viết bằng Java 7.

public @interface Genre {
String name();
}

public @interface Genres {
Genre[] value();
}

@Genres({
@Genre(name = "Pop"),
@Genre(name = "Rock")
})
public class PopRockSong {
// your code goes here
}

Ta có thể thấy chúng ta có Annotation Genre để khai báo thể loại cho một bài hát, và vì bài hát có thể mang nhiều thể loại nên chúng ta phải khai báo nhiều Annotation Genre, trước Java 8, để khai báo nhiều Annotation giống nhau ta phải khai báo một Annotation Container, cụ thể ở đây ta đã khai báo Annotation Genres dùng để chứa nhiều Annotation Genre.

Với Java 8 ta có thể khai báo một cách linh động như sau.

@Genre(name = "Pop")
@Genre(name = "Rock")
public class PopRockSong {
// your code goes here
}

Như các bạn có thể thấy, chúng ta không hề cần bất cứ Annotation Container nào. Mà chỉ cần khai báo nhiều Annotation Genre. Trình biên dịch sẽ tự động gom hết những Annotation đã được khai báo vào một Container thay cho chúng ta.

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

Việc này cực kỳ đơn giản. Một Repeating Annotation sẽ được khai báo bằng Meta-Annotation @Repeatable. Nếu không có được khai báo @Repeatable thì mặc định Annotation tạo ra sẽ không thể khai báo lặp lại nhiều lần trong cùng đoạn code.

Cùng xem đoạn code dưới đây.

@Repeatable(value = Genres.class )
public @interface Genre {
String value();
}

@Retention( RetentionPolicy.RUNTIME )
public @interface Genres {
Genre[] value() default{};
}

@Genre("Pop")
@Genre("Rock")
public static class PopRockSong {
// your code goes here
}

Đây chính là cách khai báo Repeating Annotation trong Java 8.

Tiếp theo, ta sẽ tìm hiểu làm thế nào để có thể lấy được Annotation trong quá trình xử lý.

Có hai cách như sau.

Cách thứ nhất, tương tự như trong bài Hướng dẫn sử dụng Annotations tôi đã giới thiệu, đó là xử lý bằng hàm getDeclaredAnnotation() hoặc getAnnotation().

Cách thứ hai, bạn có thể xử lý chúng bằng hàm getDeclaredAnnotationsByType() hoặc getAnnotationsByType() của Reflection API.

Nào cùng xem Repeating Annotation của chúng ta hoạt động như thế nào. Chúng ta sẽ viết một hàm main để test như sau.

public static void main(String[] args) {
PopRockSong song = new PopRockSong();
Genre[] genres = song.getClass().getAnnotationsByType(Genre.class);

for(Genre genre: genres){
System.out.println(genre.value());
}
}

Chạy và nhìn vào kết quả.

Pop
Rock

Process finished with exit code 0

Hy vọng các bạn thấy bài viết này hữu ích, đừng ngần ngại chia sẻ ý kiến cũng như đóng góp tại đây. Tạm biệt và hẹn gặp lại.

2 thoughts on “Series Java những điều có thể bạn đã biết: Java 8 Repeating Annotations

Gửi phản hồ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