neděle 18. května 2008

Ještě více statická

Ač jsem velkým příznivcem dynamických jazyků namísto násilného, alespoň z mého pohledu, rozšiřování Javy, tak jsou návrhy, které mají moje sympatie. Jedním z nich je JSR 308: Annotations on Java Types, které se snaží rozšířit možnost deklarace anotace u libovolného užití typu.

JSR 308 proposes an extension to Java's annotation system that permits annotations to appear on nearly any use of a type. (By contrast, Java SE 6 permits annotations to appear only on class/method/field/variable declarations; JSR 308 is backward-compatible and continues to permit those annotations.) Such a generalization removes arbitrary limitations of Java's annotation system, and it enables new uses of annotations

Díky tomuto jazykovému rozšíření by bylo možné vytvořit například velice silný anotační procesor pro pokročilou kontrolu typových informací. Nejlépe to ilustruje následující příklad.

01   @NonNullDefault  
02   class DAG {
03 
04       Set<Edge> edges;    
05 
06       // ...
07 
08       List<Vertex> getNeighbors(@Interned @Readonly Vertex v@Readonly 
09           List<Vertex> neighbors = new LinkedList<Vertex>();
10           for (Edge e : edges)    
11               if (e.from() == v)                          
12                   neighbors.add(e.to());      
13           return neighbors;      
14       }
15   }

(pozn: samotné anotace nejsou součástí specifikace viz vysvětlení)

  • Anotace @NonNullDefault na rádku 1. ríka, že žádná z proměnných třídy nesmí být null. To se týká rádku 4, 10, 11, 12. Zároveň návratový typ metody getNeighbors nesmí být null.
  • Dve anotace @Readonly na rádku 8. garantují, že argument metody v nebude modifikován resp. že stav objektu se nebude měnit při volání metody getNeighbors.
  • Anotace Interned použitá na rádku 8. říká, že použití operátoru rovnosti objektu na řádku 11. je validní.

Toliko k sémantice anotací a teď si představte, že kompilátor vám všechny tyto restrikce hlídá. Jak je muže hlídat? Právě díky tomu, že můžete anotace vůbec na tato místa (další príklady umístení) umístit. Potom už stačí napsat vhodný anotační procesor, který anotace ohlídá a zavěsit jej do kompilátoru.

V této souvislosti doporučuji k nahlédnutí velice zajímavou prezentaci Preventing bugs with pluggable type-checking, která ukazuje možnosti otevřené touto specifikací. Samozřejmě, že využití pro takto širokou deklaraci anotací by se našlo více, například mě napadá dokumentace API.

Jedním z aspektu, které by toto rozšíření použití anotací přineslo, by zajisté bylo zvýšení komplexnosti kódu a vetší přiklonění k statické straně (síly ;-). Na druhou stranu, u kterého z dalších rozšíření syntaxe platí, že je možné jej jednoduše ignorovat, pokud chcete. Pro me osobně je příklad s rozšířenou typovou kontrolou na úrovni kompilace velice silným argumentem pro tento návrh.

Související články