2010-12-29 19 views
24

Paso la mayor parte de mi tiempo programando en Python, así que perdóneme si mi enfoque a este problema es de corta distancia:Decoradores tipo Python en Java?

Quiero que ciertos métodos de una clase requieran credenciales de inicio de sesión. Simplemente, cada método debe verificar si la variable de clase user está configurada, y si es así, continuar, pero si no, escupir un mensaje de "necesita iniciar sesión".

En Python, yo solo escribiría un decorador para hacer esto. ¿Cómo puedo lograr lo mismo en Java con el menor código redundante posible?

Gracias!

+1

También podría echar un vistazo a la respuesta a esta pregunta: http://stackoverflow.com/questions/2541554/java-method-missing-ala-ruby-for-decorating –

Respuesta

12

Una forma de resolver esto en Java es usar una herramienta Aspect-oriented programming. Una de esas herramientas es AspectJ. Probablemente descubrirá que este tipo de problema es un ejemplo que se usa comúnmente para motivar el AOP.

AOP podría ser una forma bastante pesada para resolver este problema en particular, por lo que es posible que desee explorar simplemente agregando las comprobaciones apropiadas para cada método. No hay ningún equivalente directo a los decoradores de Python en Java nativo.

+0

Gracias por la respuesta. Tengo muchos otros problemas similares a este, por lo que podría no ser demasiado 'pesado'. Buscaré en AspectJ y en Guice. – awegawef

8

Lo más simple es escribir un método como "assertCredentials" y llamar a ese método al comienzo de cada método que necesite credenciales. Si las credenciales no están establecidas, el método arrojará una excepción, que abortará el método principal.

Java tiene anotaciones que pueden usarse para decorar métodos, etc., pero no creo que el uso de anotaciones en este caso simplifique las cosas.

-2

Debería mirar en bean validation framework.

+0

No creo que la validación de beans ayude. 1) Se da a entender que otros métodos no requieren credenciales, por lo que no puede tratar un objeto sin credenciales como "no válido". 2) El marco de validación no garantiza que los objetos siempre sean válidos de todos modos. Tienes que llamar al método "validar" ... –

6

Puede probar Google Guice AOP que es relativamente más ligero que el marco AOP como AspectJ.

Cuestiones relacionadas