12/08/2018, 15:42

Java 8 Repeating 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. Hãy cùng nhìn qua đoạn code bên dưới. Đoạn code này được ...

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. 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ý.

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

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

0