Ho provato a utilizzare le annotazioni per fornire specifiche eseguibili per codificare e generare test unitari per il mio progetto algebra . Ad esempio, ho un'interfaccia con un metodo per aggiungere due oggetti insieme e le proprietà che ti aspetteresti dalle aggiunte sono contrassegnate come annotazioni:
interface Group<E> extends Set<E> {
@Commutative @Associative @Identity("zero") @Inverse("neg")
E plus (E, E);
E zero ();
E neg (E e);
}
Ho un processore di annotazioni (parzialmente implementato) che genera test per queste proprietà per qualsiasi classe che afferma di implementare questa interfaccia.
Questo è un esempio di annotazioni "utente": @Commutative
, @Associative
, ecc. Sono implementate come parte della libreria algebra, non come parte dello strumento di elaborazione delle annotazioni; generare nuove proprietà con i test è una semplice questione di aggiungere un nuovo tipo di annotazione con un metodo speciale che controlla la proprietà.
Le annotazioni sono state moderatamente adatte a questo compito, sebbene ci siano molte lacune. Ad esempio, le annotazioni java non hanno una nozione di ereditarietà, quindi il mio processore deve cercare esplicitamente le annotazioni su tutte le superinterfacce di una classe. Inoltre, Java non supporta la marcatura di un metodo con più copie della stessa annotazione, quindi non posso scrivere @DistributesOver("foo")
e @DistributesOver("bar")
sullo stesso metodo.