Skip to main content

Java 8 - Repeating annotation

Annotations support từ khi được giới thiệu trong phiên bản Java 5, tính năng này đã trở thành một tính năng hữu ích và được sử dụng rộng rãi.

Tuy nhiên, hạn chế của việc sử dụng annotatioin này là các annotation có thể không được khai báo nhiều hơn một lần cùng một vị trí. Java 8 đã giới thiệu tính năng repeating annotation. Nó cho phép các annotation giống nhau có thể được khai báo nhiều lần cùng một vị trí.

Repeating annotation sử dụng chú thích @Repeatable.

Ví dụ:

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class RepeatingAnnotations {
	@Target(ElementType.TYPE)
	@Retention(RetentionPolicy.RUNTIME)
	public @interface Filters {
		Filter[] value();
	}
	
	@Target(ElementType.TYPE)
	@Retention(RetentionPolicy.RUNTIME)
	@Repeatable(Filters.class)
	public @interface Filter {
		String value();
	};
	
	@Filter("filter1")
	@Filter("filter2")
	public interface Filterable {
	}
	
	public static void main(String[] args) {
		for (Filter filter : Filterable.class
				.getAnnotationsByType(Filter.class)) {
			System.out.println(filter.value());
		}
	}
}

Giải thích: Đây là lớp sử dụng Filter annotation với @Repeatable (Filters.class). Lớp Filters chỉ nắm giữ Filter annotation nhưng trình biên dịch Java compiler cố gắng để ch giấu sự hiện diện của nó từ developer. Như vậy Filterable interface có chú thích Filter được định nghĩa hai lần (không đề cập tới Filters).

Ngoài ra, Reflection API cũng cung cấp phương thức mới là getAnnotationsByType() để trả về các repeating annotation. Chú ý rằng Filterable.class.getAnnotation(Filters.class) sẽ trả về instance của Filters bởi trình biên dịch.

Kết quả khi chạy chương trình:

filter1
filter2