Java Type Annotations là một tính năng được giới thiệu trong Java 8 cho phép bạn áp dụng các annotation không chỉ cho các thành phần như lớp, phương thức, hoặc trường mà còn cho các kiểu dữ liệu. Tính năng này mở rộng khả năng của annotations và cho phép bạn tạo ra các chú thích có thể kiểm tra kiểu giúp cải thiện khả năng đọc mã và hỗ trợ lập trình kiểm tra.
1. Khái Niệm về Type Annotations
Type Annotations cho phép bạn gắn các chú thích vào các kiểu dữ liệu. Điều này có thể hữu ích trong nhiều tình huống, chẳng hạn như:
- Kiểm tra kiểu tĩnh với các công cụ như Checker Framework để xác định và phát hiện lỗi.
- Cung cấp thông tin về các yêu cầu của kiểu dữ liệu cho các lập trình viên khác.
- Tạo ra các framework tùy chỉnh cho việc xử lý các chú thích trong mã nguồn như @Annotation Trong Spring Boot
Type Annotations có thể được áp dụng cho bất kỳ kiểu nào, bao gồm cả kiểu tham số hóa (generic types), kiểu mảng, kiểu phương thức, v.v.
2. Ví dụ
- Định nghĩa annotation @GenderSubset
@Documented @Target({ElementType.METHOD, ElementType.FIELD}) // áp dụng cho method và field @Retention(RUNTIME) @Constraint(validatedBy = GenderSubSetValidator.class) public @interface GenderSubset { Gender[] anyOf(); String message() default "must be any of {anyOf}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
Chúng ta có thể sử dụng @Target
để chỉ định vị trí mà chú thích có thể được áp dụng cho các kiểu data type khác nhau parameters, array, field, và method.
- Viết logic validate Gender
public class GenderSubSetValidator implements ConstraintValidator<GenderSubset, Gender> { private Gender[] genders; @Override public void initialize(GenderSubset constraint) { this.genders = constraint.anyOf(); } @Override public boolean isValid(Gender value, ConstraintValidatorContext context) { return value == null || Arrays.asList(genders).contains(value); } }
- Sử dụng
@GenderSubset
vào DTO trong API
public class UserRequestDTO implements Serializable { @GenderSubset(anyOf = {MALE, FEMALE, OTHER}) private Gender gender; }