sobota 4. dubna 2015

Uložení anotačního typu jako grafu

V jazyce Java je možné deklarovat speciální druh rozhraní zvaný anotační typ. Tento druh rozhraní se odlišuje od klasické anotace symbolem @, který předchází klíčovému slovu interface, jak je vidět na následujícím popisu gramatiky rozhraní.
AnnotationTypeDeclaration:
    InterfaceModifiersopt @ interface Identifier AnnotationTypeBody

AnnotationTypeBody:
    { AnnotationTypeElementDeclarationsopt }

AnnotationTypeElementDeclarations:
    AnnotationTypeElementDeclaration
    AnnotationTypeElementDeclarations AnnotationTypeElementDeclaration
Dle popisu lze deklaraci anotačního typu začít seznamem modifikátorů, následuje název anotačního typu a na závěr je nutno doplnit tělo deklarace anotačního typu. Při vytváření anotačního typu není možné implementovat žádné rozhraní ani dědit od jiného anotačního typu nebo čehokoliv jiného. Každý anotační typ je automaticky potomkem třídy java.lang.annotation.Annotation. I tento vztah dědění bude do grafu zaznamenán klasickým způsobem, jaký je u rozhraní.

Modifikátory anotačního typu jsou stejné jako u rozhraní a proto budou ukládány stejným způsobem.

Gramatika těla anotačního typu je v dokumentaci Java popsána následovně:
AnnotationTypeElementDeclaration:
    AbstractMethodModifiersopt Type Identifier ( ) Dimsopt DefaultValueopt ;
    ConstantDeclaration
    ClassDeclaration
    InterfaceDeclaration
    EnumDeclaration
    AnnotationTypeDeclaration
    ;

DefaultValue:
    default ElementValue
Zde jsou opětjisté podobnosti s deklarací rozhraní resp. třídy. Deklarace konstant, vnitřních tříd a rozhraní je stejná jako v deklaraci rozhraní. Rozdíl jde vidět u deklarace metod. V deklaraci anotačního typu nelze deklarovat generickou metodu a dále zde lze nastavit defaultní hodnotu metody. Protože nás defaultní hodnota metody nezajímá budeme tuto informaci v grafu ignorovat. S takovýmto zjednodušením lze na deklaraci abstraktních metod v anotačním typu pohlížet stejně jako na deklaraci metod v klasickém rozhraní. Tělo deklarace anotačního typu navíc umožňuje deklaraci výčtů (enum) a další vnitřní anotační typy. S deklarovanými vnitřními výčty a anotačními typy bude pracováno jako s klasickými vnitřními třídami. Bude vytvořen vztah s názvem have_inner mezi vrcholem anotačního typu a relevantním vrcholem (vrcholem výčtu nebo vnitřním anotačním typem).

Souhrn

Vlastnosti:
  • name (String)
  • static (yes/no)
  • abstract (yes/no)
  • inner (yes/no)
  • access (public/private/protected)
  • package (String) 
  • strictfp (yes/no) 
Vztahy:
  • extends (java.lang.annotation.Annotation)
  • uses (Třída, výčet nebo rozhraní)
  • have_inner (Vnitřní třída, výčet nebo rozhraní)
  • have_anonym (Anonymní třída)
  • have_method (Metoda)
  • have_attribute (Atribut)
Jednoduchým příkladem může být následující kód a jeho odpovídající graf. V příkladu je deklarováno vnitřní rozhraní s atributem. Dále jeden atribut s datovým typem String a jedna metoda s návratovým typem int (lze použít pouze primitivních datových typů, čili datový typ void není povolen) a defaultní hodnotou.


1
2
3
4
5
6
7
8
9
package test_package;
public @interface AnotType {
 interface VnitrniRozhrani{
  public static String jina_konstanta = "hodnota";
 };
 public VnitrniRozhrani vr = new VnitrniRozhrani() {};
 public String konstanta = "hodnota";
 public int metoda () default 1;
}



Zdroje:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.6

Žádné komentáře:

Okomentovat