Contiamo sul tuo aiuto per ampliare le nostre sezioni sull'informatica.
- 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
Tipo | Nome e descrizione |
---|---|
Class |
value
|
Riepilogo dei 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
Puoi aggiungere valore ai nostri contenuti assistendo con la tua anzianità nelle spiegazioni.