2010-12-29 14 views
24

Trascorro gran parte del mio tempo a programmare in Python, quindi perdonatemi se il mio approccio a questo problema è a breve:Decoratori in stile Python in Java?

Desidero che determinati metodi di una classe richiedano credenziali di accesso. Semplicemente, ogni metodo dovrebbe verificare se è impostata la variabile di classe user, e se sì, continuare, ma in caso contrario, sputare un messaggio "è necessario accedere".

In Python, vorrei solo scrivere un decoratore per farlo. Come posso ottenere la stessa cosa in java con il minor numero possibile di codice ridondante?

Grazie!

+1

Puoi anche dare un'occhiata alla risposta a questa domanda: http://stackoverflow.com/questions/2541554/java-method-missing-ala-ruby-for-decorating –

risposta

12

Un modo per risolvere questo problema in Java consiste nell'utilizzare uno strumento Aspect-oriented programming. Uno di questi strumenti è AspectJ. Probabilmente troverai che questo tipo di problema è un esempio comunemente usato per motivare AOP.

AOP potrebbe essere un modo abbastanza pesante per risolvere questo particolare problema, quindi è consigliabile esplorare solo aggiungendo controlli appropriati a ciascun metodo. Non esiste alcun equivalente diretto ai decoratori di Python in Java nativo.

+0

Grazie per la risposta. Ho molti altri problemi simili a questo, quindi potrebbe non essere troppo 'pesante'. Guarderò AspectJ e Guice. – awegawef

8

La cosa più semplice da fare è scrivere un metodo come "assertCredentials" e chiamare tale metodo all'inizio di ogni metodo che necessita di credenziali. Se le credenziali non sono impostate, il metodo dovrebbe generare un'eccezione, che interromperà il metodo genitore.

Java ha annotazioni che possono essere utilizzate per decorare metodi, ecc., Ma non penso che l'uso di annotazioni in questo caso semplificherebbe le cose.

-2

Si dovrebbe esaminare bean validation framework.

+0

Non credo che aiuti la validazione del bean. 1) È implicito che altri metodi non richiedono credenziali, quindi non puoi trattare un oggetto senza credenziali come "non valido". 2) Il framework di validazione non garantisce che gli oggetti siano sempre comunque validi. Devi chiamare il metodo "validate" ... –

6

Si può provare Google Guice AOP che è relativamente più leggero del framework AOP come AspectJ.