Csináltam egy @Id annotációt, melynek van egy int paramétere. Az lenne a kérdésem hogy lehetne megakadályozni hogy ez a paraméter ne lehessen 0 vagy negatív szám ?
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Id { public int value() default 1; }
Természetesen fordítási időben gondoltam az ellenőrzést, nem pedig úgy hogy amikor fut a program kiolvasom mi van az annotáció paramétereként megadva és dobok egy exception-t. Hiszen a fordító azt is felismeri hogy @Id("hahó") nem lehet, hiszen nem String típusú a paraméter. De vajon egy típuson belüli validáció lehetséges-e fordítási időben, hiszen jó lenne ha valaki @Id(-28)-at, ír akkor rögtön megjelenjen a piros villogó a fejlesztő eszközén.
Valamit nagyon nem értek, persze lehet hogy a fától nem látom az erdőt :) Van egy annotációm, a neve View. Amikor egy osztálynál vizsgálom hogy el van-e látva ezzel az annotációval, kell egy "számomra értelmetlen" cast, különben a kód nem fordul le. Ha ugyanezt egy Field-nél vizsgálom, nem kell cast-olni. Az osztálynál miért kell ??? Egyébként a dolog annotáció független, más annotációval is a helyzet ugyanez.
Class cls = ...; Field field = cls.getField(...);
View view = (View)cls.getAnnotation(View.class); //??? mért kell cast ??? View view2 = field.getAnnotation(View.class);
Dokumentáció szerint a Class osztály getAnnotation() metódusa:
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
Dokumentáció szerint a Field osztály getAnnotation() metódusa:
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
4 Comments
Keresztes József (xesj.hu)
Sziasztok.
Csináltam egy @Id annotációt, melynek van egy int paramétere. Az lenne a kérdésem hogy lehetne megakadályozni hogy ez a paraméter ne lehessen 0 vagy negatív szám ?
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Id {
public int value() default 1;
}
Természetesen fordítási időben gondoltam az ellenőrzést, nem pedig úgy hogy amikor fut a program kiolvasom mi van az annotáció paramétereként megadva és dobok egy exception-t.
Hiszen a fordító azt is felismeri hogy @Id("hahó") nem lehet, hiszen nem String típusú a paraméter. De vajon egy típuson belüli validáció lehetséges-e fordítási időben, hiszen jó lenne ha valaki @Id(-28)-at, ír akkor rögtön megjelenjen a piros villogó a fejlesztő eszközén.
Joe
palacsint
Az APT-t (http://docs.oracle.com/javase/7/docs/technotes/guides/apt/) nézném meg, azzal lehet ilyesmiket csinálni. Elég régen használtam, de ha jól emlékszem, akkor kivételdobáskor leáll a buildelés is.
Eclipse-ben is van Java Compiler / Annotation Processing beállítási lehetőség, de ezt még sosem használtam.
Keresztes József (xesj.hu)
Sziasztok !
Valamit nagyon nem értek, persze lehet hogy a fától nem látom az erdőt :)
Van egy annotációm, a neve View. Amikor egy osztálynál vizsgálom hogy el van-e látva ezzel az annotációval,
kell egy "számomra értelmetlen" cast, különben a kód nem fordul le.
Ha ugyanezt egy Field-nél vizsgálom, nem kell cast-olni. Az osztálynál miért kell ???
Egyébként a dolog annotáció független, más annotációval is a helyzet ugyanez.
Class cls = ...;
Field field = cls.getField(...);
View view = (View)cls.getAnnotation(View.class); //??? mért kell cast ???
View view2 = field.getAnnotation(View.class);
Dokumentáció szerint a Class osztály getAnnotation() metódusa:
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
Dokumentáció szerint a Field osztály getAnnotation() metódusa:
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
Keresztes József (xesj.hu)
A megoldás: a mellékelt forrás első sorát így kell javítani:
Class<?> cls = ...