Javada Özel Notasyonlar (Custom Annotations) Oluştutulması ve Kullanımı
Merhaba arkadaşlar ,
Java da notasyonlar sınıf, method ve parametrelere özellik katmak için kullanılır. Notasyonlar Java 5’den beri Java ortamında kullanılan bir yapıdır. Örnek vericek olursak aklımıza ilk olarak @Override gelir , bu notasyonun kullanıldığı yerde anlarız ki miras alınan sınıfın methodu ezilmiştir.
Notasyonlar farklı yerlerde kullanılabilir : sınıf , method, parametre , method’un aldığı parametreler de vs.
İlk olarak notasyon tanımlayalım ve bir örnek yaparak daha iyi anlayalım .
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Fieldlarda kullanılacağını belirttik. @Target(ElementType.FIELD) //tanımlamamızıda bir notasyon ile yapıyoruz. public @interface Size { String size(); } |
Şimdi ise örneğimize geçelim . Öyle bir notasyon yapalımki bize herhangi bir sınıftaki fieldların değerlerinin uzunluğunu kontrol etsin. Bunun için senaryomuzu şöyle , bir tane Customer sınıfımız olsun ve bunu db ye kaydederken kendi yazdığımız özel notasyon ile kontrol edelim.
ilk önce notasyonumuzu yazalım .
ParameterSize.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package io.bilisim; /** * * @author m.kilic */ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //Bu notasyonlar kendi notasyonumuza çalışma zamanında erişilir. @Retention(RetentionPolicy.RUNTIME) //Fieldlarda kullanılacağını belirttik. @Target(ElementType.FIELD) //@interface sçzcüğü ile notasyonumuzu oluşturuyoruz Notasyon ismimizi "ParameterSize" yapalım @interface ParameterSize { // İki tane parametremiz var min() ve max() // default anahtar sözcüğü ismindende anlaşıldığı gibi // eğer bu parametreler notasyonda setlenmemiş ise // buraya atanan değerler kullanılıyor int min() default 5; int max() default 44; } |
Customer sınıfımızı yazalım
Customer.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package io.bilisim; /** * * @author m.kilic */ public class Customer { public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @ParameterSize(min = 3, max = 25) public String firstName; @ParameterSize(min = 3, max = 40) public String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } |
Sahte dao servisimizi yazıyoruz ?
CustomerDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package io.bilisim; /** * * @author m.kilic */ public class CustomerDao { public String createCustomer(Customer customer) { return customer.getFirstName() +" isimli kullanıcı oluşturuldu."; } } |
Şimdi ise notasyonumuza takılan parametreler için fırlatacağımız hata sınıfı yapalım.
ExceptionParameterSize.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package io.bilisim; /** * * @author m.kilic */ public class ExceptionParameterSize extends Exception{ public ExceptionParameterSize(String message){ super(message); } } |
CustomerServiceProxy.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package io.bilisim; import java.lang.reflect.Field; /** * * @author m.kilic */ public class CustomerServiceProxy { CustomerDao customerDao = new CustomerDao(); public CustomerServiceProxy(Customer customer) throws ExceptionParameterSize { annotationCheck(customer); System.out.println(customerDao.createCustomer(customer)); } public static void annotationCheck(Customer customer) throws ExceptionParameterSize { ParameterSize anno = null; //Reflection kullanarak notasyonumuzdaki değerleri alıp //Gelen nesne'nin bu şartları uygunluğunu kontrol ediyoruz. Field[] fields = customer.getClass().getDeclaredFields(); for (Field field : fields) { anno = field.getDeclaredAnnotation(ParameterSize.class); if(field.getName().equals("firstName") && anno.min() > customer.getFirstName().length() || customer.getFirstName().length() > anno.max()) { throw new ExceptionParameterSize("! - Field Name : "+field.getName() + " parameterSize : Min " + anno.min() + " and Max " + anno.max()); } else if(field.getName().equals("lastName") && anno.min() > customer.getLastName().length() || customer.getLastName().length() > anno.max() ){ throw new ExceptionParameterSize("! - Field Name : "+field.getName() + " parameterSize Min : " + anno.min() + " and Max : " + anno.max()); } } } } |
Test edelim bakalım çıktısı nasıl olacak ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package io.bilisim; /** * * @author m.kilic */ public class TestProject { public static void main(String[] args) throws ExceptionParameterSize { Customer c =new Customer("Mehmet", "KILIÇ"); try { CustomerServiceProxy csp =new CustomerServiceProxy(c); } catch (Exception e) { System.err.println(e.getLocalizedMessage()); } } } |
Çıktı (her iki durum için) :