Tuyển dụng
Repeat Annotation In Java
Trong một vài trường hợp, bạn cần sử dụng nhiều lần annotation tại cùng 1 vị trí như trên một method, constructor.
Ví dụ khi viết cơ chế về authorization và cho phép chỉ có admin và superAdmin có thể tạo 1 user
1
2
3
4
5
6
7
8
9
|
// java 7 not allow this format
@ Role ( "Admin" )
@ Role ( "SuperAdmin" )
public void addUser ( )
{
System . out . println ( "This is admin app" ) ;
}
|
1. Với Java 7 và phiên bản thấp hơn
- Để giải quyết bài toán như trên sẽ có 2 cách:
- Một là tạo annotation với value() method trả về mảng String của roleName
Khai báo
1
2
3
4
5
6
7
8
|
@ Retention ( RetentionPolicy . RUNTIME )
@ Target ( ElementType . METHOD )
public @ interface Role {
String [ ] value ( ) default "Normal" ;
}
|
Sử dụng:
1
2
3
4
5
6
7
|
@ Role ( { "Admin" , "SuperAdmin" } )
public void addUser ( )
{
System . out . println ( "Add user" ) ;
}
|
- Cách thứ 2 là tạo ra 1 annotation container chứa annotation Role
Khai báo contained annotation:
1
2
3
4
5
6
7
8
|
@ Retention ( RetentionPolicy . RUNTIME )
@ Target ( ElementType . METHOD )
public @ interface RoleAnnotation {
String roleName ( ) default "Normal" ;
String systemName ( ) default "Internal App" ;
}
|
Khai báo container annotation:
1
2
3
4
5
6
7
8
|
@ Retention ( RetentionPolicy . RUNTIME )
@ Target ( ElementType . METHOD )
public @ interface RoleAnnotationContainer {
RoleAnnotation [ ] value ( ) ;
}
|
Sử dụng:
1
2
3
4
5
6
7
8
9
|
// java 7: use same Annotation
@ RoleAnnotationContainer ( value = { @ RoleAnnotation ( roleName = "Admin" , systemName = "Administration app" ) ,
@ RoleAnnotation ( roleName = "SuperAdmin" , systemName = "Administration app" ) } )
public void editUser ( )
{
System . out . println ( "This is Administration app" ) ;
}
|
Hoặc:
1
2
3
4
5
6
7
8
|
@ RoleAnnotationContainer ( { @ RoleAnnotation ( roleName = "Admin" , systemName = "Administration app" ) ,
@ RoleAnnotation ( roleName = "Super Admin" , systemName = "Administration app" ) } )
public void deleteUser ( )
{
System . out . println ( "This is Administration app" ) ;
}
|
2. Với Java 8
Java 8 hỗ trợ repeat annotation bằng cách sử dụng @Repeatable
- Khai báo contained annotation: giá trị của attribute value trỏ đến container annotation
1
2
3
4
5
6
7
|
@ Repeatable ( value = NewRoleAnnotationContainer . class )
public @ interface RoleRepeatAnnotation {
String roleName ( ) default "Normal" ;
String systemName ( ) default "Internal App" ;
}
|
- Khai báo container annotation: method value trả về 1 mảng contained annotation
1
2
3
4
5
|
public @ interface NewRoleAnnotationContainer {
RoleRepeatAnnotation [ ] value ( ) default { } ;
}
|
- Sử dụng:
1
2
3
4
5
6
7
8
|
@ RoleRepeatAnnotation ( roleName = "Admin" , systemName = "Client app" )
@ RoleRepeatAnnotation ( roleName = "Normal" , systemName = "Client app" )
public void getDetail ( )
{
System . out . println ( "This is client app" ) ;
}
|
3. Note
- Lưu ý: khi khai báo Retention cho contained annotation và container annotation. Retention của container annotation phải có giá trị bằng hoặc lớn hơn retention của container annotation.
Ví dụ chúng ta không thể khai báo như sau:
1
2
3
4
5
6
7
8
9
10
|
@ Retention ( RetentionPolicy . RUNTIME )
@ Target ( ElementType . METHOD )
@ Repeatable ( Schedules . class )
public @ interface Schedule {
String dayOfMonth ( ) default "first" ;
String dayOfWeek ( ) default "Mon" ;
int hour ( ) default 12 ;
}
|
Và
1
2
3
4
5
6
7
|
@ Retention ( RetentionPolicy . SOURCE )
@ Target ( ElementType . METHOD )
public @ interface Schedules {
Schedule [ ] value ( ) ;
}
|
- Lưu ý tương tự với khai báo @Target khi sử dụng repeat annotation
1
2
3
4
5
6
7
8
9
|
@ Target ( ElementType . PACKAGE )
@ Repeatable ( Schedules . class )
public @ interface Schedule {
String dayOfMonth ( ) default "first" ;
String dayOfWeek ( ) default "Mon" ;
int hour ( ) default 12 ;
}
|
Và:
1
2
3
4
5
6
|
@ Target ( ElementType . METHOD )
public @ interface Schedules {
Schedule [ ] value ( ) ;
}
|
Kiến thức yêu cầu( Prerequirement )
- Java core
- Khái niệm về Annotation và cách tạo 1 custom annotation. Có thể tham khảo các link sau:
https://docs.oracle.com/javase/tutorial/java/annotations/basics.html
http://www.mkyong.com/java/java-custom-annotations-example/
- Tất cả về Email Marketing 2.0
- Lịch sử các Ngôn ngữ lập trình [Inforgraphic]
- Không cho trình duyệt firefox tự động update
- Điểm lại những sự kiện đáng chú ý tại hội nghị Universe 2018 của GitHub
- Giới thiệu Facebook Rebound
- Làm sao để mọi người có thể checkin fanpage của bạn?
- Cảm giác lần đầu trải nghiệm Node.js
- Lập trình viên có cần học đại học hay không?
- Cảnh báo lỗ hổng bảo mật trên Safari, người dùng Apple cẩn trọng
- Hướng dẫn xác định chi phí, giá phần mềm, giá website, giá ứng dụng
- Rút tiền từ ATM bằng điện thoại thông minh
- Xóa mật khẩu file excel chỉ với 6 bước đơn giản
DVMS chuyên:
- Tư vấn, xây dựng, chuyển giao công nghệ Blockchain, mạng xã hội,...
- Tư vấn ứng dụng cho smartphone và máy tính bảng, tư vấn ứng dụng vận tải thông minh, thực tế ảo, game mobile,...
- Tư vấn các hệ thống theo mô hình kinh tế chia sẻ như Uber, Grab, ứng dụng giúp việc,...
- Xây dựng các giải pháp quản lý vận tải, quản lý xe công vụ, quản lý xe doanh nghiệp, phần mềm và ứng dụng logistics, kho vận, vé xe điện tử,...
- Tư vấn và xây dựng mạng xã hội, tư vấn giải pháp CNTT cho doanh nghiệp, startup,...
Vì sao chọn DVMS?
- DVMS nắm vững nhiều công nghệ phần mềm, mạng và viễn thông. Như Payment gateway, SMS gateway, GIS, VOIP, iOS, Android, Blackberry, Windows Phone, cloud computing,…
- DVMS có kinh nghiệm triển khai các hệ thống trên các nền tảng điện toán đám mây nổi tiếng như Google, Amazon, Microsoft,…
- DVMS có kinh nghiệm thực tế tư vấn, xây dựng, triển khai, chuyển giao, gia công các giải pháp phần mềm cho khách hàng Việt Nam, USA, Singapore, Germany, France, các tập đoàn của nước ngoài tại Việt Nam,…
Quý khách xem Hồ sơ năng lực của DVMS tại đây >>
Quý khách gửi yêu cầu tư vấn và báo giá tại đây >>