středa 25. března 2015

Uložení třídy jako grafu

Podle popisu třídy v dokumentaci Java7 (docs.oracle.com) deklarace třídy definuje nový referenční typ a popisuje, jak je implementována.

Existují třídy tzv. top level a naopak vnořené třídy. Vnořené třídy jsou deklarované uvnitř jiné třídy nebo rozhraní. Mezi vnořené třídy se řadí členské třídy, lokální třídy a anonymní třídy. V grafu budou mít vnitřní třídy speciální vrchol, kde anonymní třídy budou odlišeny jiným druhem vrcholu.

Třída může obsahovat atributy, metody, instance, statickou inicializaci a konstruktory. V grafu budou mít třídy vztah s atributy (have_attribute) a metodami (have_method). S konstruktory bude zacházeno jako s metodami s tím rozdílem, že budou vrcholy odlišeny typem.

Popis deklarace třídy je následující:
ClassDeclaration:
    NormalClassDeclaration
    EnumDeclaration

NormalClassDeclaration:
    ClassModifiersopt class Identifier TypeParametersopt
                                               Superopt Interfacesopt ClassBody
Z první části je zjevné, že existují dva druhy tříd. První jsou normální třídy a druhou je výčet (enum). Mezi normální třídou a výčtem je mnoho rozdílného, z hlediska grafu však ne, proto budou tyto dvě entity rozlišeny pouze typem vrcholu a dále s nimi bude zacházeno stejně.

Při deklaraci třídy jsou možné následující modifikátory:
  • Annotation
  • public
  • protected
  • private
  • abstract
  • static
  • final
  • strictfp  
Modifikátor Annotation značí anotaci třídy. Tedy, že v tomto místě bude anotace, která se vztahuje na následující třídu. Tento vztah bude symbolizován hranou mezi třídou a vrcholem anotace s názvem have_annotation. Přístupové modifikátory public, protected a private budou zachyceny v grafu vlastností access. Abstract, static a final mají v grafu speciální položku mezi vlastnostmi vrcholu. Strictfp, který striktně vynucuje plovoucí řadovou čárku u výrazů (2) bude do grafu ukládán pod stejným názvem.

S třídami, které deklarují generický typ bude zacházeno jako s ostatními třídami. Jméno třídy bude použito bez typového parametru. Java kompilátor se již postará o to aby byl typový parametr používán správně, proto není potřeba toto v grafu ošetřovat.

Třída může dědit od rodiče, kterého může mít pouze jednoho. V grafu nebude na počet předků brán zřetel (o to se stará kompilátor). Vrchol zastupující třídu tak bude mít možnost mít vztah s jinou třídou (extends), což bude charakterizovat dědění. Dále může třída implementovat rozhraní. Je možné implementovat více rozhraní, proto v grafu bude možnost navázat vztah na více vrcholů typu rozhraní.

Protože z hlediska vytváření grafu není mezi vnitřní třídou, anonymní třídou a jinou třídou rozdíl, bude s nimi pracováno stejně. Budou však rozlišeny typem vrcholu.

Protože není potřeba podrobně mapovat strukturu java balíků (package), bude tato informace uložena v každé tříde pouze jako vlastnost.


Souhrn

Vlastnosti:
  • name (String) 
  • static (yes/no)
  • abstract (yes/no)
  • final (yes/no)
  • anonym (yes/no)
  • inner (yes/no)
  • access (public/private/protected)
  • package (String) 
  • strictfp (yes/no) 
Vztahy:
  • extends (Třída)
  • uses (Třída)
  • implements (Rozhraní)
  • have_inner (Vnitřní třída)
  • have_anonym (Anonymní třída)
  • have_method (Metoda)
  • have_attribute (Atribut)
  • have_annotation (Anotace)
Stejný popis vrcholu bude mít vnitřní třída, anonymní třída a výčet.

Pro příklad je vytvořen následující kód. Třída s názvem Třída je označena modifikátory public a final. Dále tato třída dědí od třídy Object a implementuje rozhraní s názvem Runnable. Toto rozhraní vyžaduje implementaci metody run. Třída dále obsahuje jeden atribut, který je navíc typu, jež je deklarován uvnitř třídy. Obsažena je tedy také vnitřní třída s názvem VnitrniTrida, která disponuje jením atributem.

Ukážeme si, jak by mohl vypadat graf pro tento kód.



1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package experiment;

public final class Trida extends Object implements Runnable{
    class VnitrniTrida{
        public String atribut_vnitrni_tridy;
    }

    private VnitrniTrida atribut = new VnitrniTrida();
    public void run() {
        // ..
    }
}




Zdroje:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.4

Žádné komentáře:

Okomentovat