• groovy.lang.Category
@Documented@Retention(RetentionPolicy.SOURCE)@Target(ElementType.TYPE)@GroovyASTTransformationClass("org.codehaus.groovy.transform.CategoryASTTransformation")public @interfaceCategory

Trasforma una classe o un'interfaccia Groovy di tipo istanza in una categoria Groovy convenzionale di tipo statico.

Le categorie Groovy sono il meccanismo originale usato da Groovy per aggiungere nuovi metodi alle classi. La scrittura delle categorie richiedeva l'utilizzo di uno stile di scrittura delle classi in cui tutti i metodi erano statici e veniva definito un parametro self aggiuntivo. L'autoparametro e la natura statica dei metodi sono scomparsi una volta applicati dal framework di metaclassi di Groovy, ma alcuni consideravano lo stile di scrittura un po' rumoroso. Questa trasformazione consente di scrivere le categorie senza il "rumore apparente", ma lo aggiunge nuovamente in fase di compilazione, in modo che le classi appaiano come categorie normali.

Potrebbe sembrare strano scrivere i miglioramenti delle classi/oggetti usando una notazione sintetica, poi aggiungere del "rumore" e poi rimuovere il rumore durante l'applicazione delle categorie. Se questo vi preoccupa, potreste prendere in considerazione l'uso del metodo Groovy ExpandoMetaClass di Groovy, che evita del tutto la definizione delle categorie. Se si è già investito nelle categorie o se si apprezzano alcune delle altre funzionalità attualmente offerte dalle categorie, si può continuare a leggere.

Il meccanismo: durante la compilazione, tutti i metodi vengono trasformati in metodi statici con un parametro self aggiuntivo del tipo fornito come parametro di annotazione (il tipo predefinito per i parametri self è Object che potrebbe essere più ampio di quanto si voglia, quindi di solito è bene specificare un tipo). Le proprietà invocate utilizzando i riferimenti "this" vengono trasformate in modo da essere invocate sul parametro self aggiuntivo e non sull'istanza della categoria. (Si ricordi che, una volta applicata la categoria, avverrà l'inverso e si tornerà ad avere concettualmente dei metodi sull'oggetto this di nuovo!).

Le classi conformi alle convenzioni convenzionali delle categorie di Groovy possono essere usate all'interno di use o mescolate in fase di esecuzione con l'opzione mixin sulle classi.

Un esempio che mostra un metodo use (che consente un'applicazione fine dei metodi di categoria):

@Category(Integer)classIntegerOps{deftriple(){this*3}}

 use (IntegerOps){assert25.triple()==75}

Oppure, "mescolare" i metodi in fase di esecuzione:

@Category(List)classShuffler{defshuffle(){def result =newArrayList(this)
         Collections.shuffle(result)
         result
     }}classSentenceextendsArrayList{Sentence(Collection initial){super(initial)}}
 Sentence.mixin Shuffler

 def words =["The","quick","brown","fox"]
 println newSentence(words).shuffle()// => [quick, fox, The, brown]       (order will vary)

Riassunto degli elementi

Riepilogo opzionale degli elementi
Tipo Nome e descrizione
Class value

Predefinito:
Oggetto.classe

Riepilogo dei metodi ereditati

Metodi ereditati
Metodi ereditati dalla classe Nome
class Object wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll

Dettaglio elemento

pubblico Classevalore

Predefinito:
Oggetto.classe