2010-08-08 10 views
6

Usando multimétodos, podemos agregar métodos a las clases de Java existentes. Mi pregunta es si es posible redefinir un método específico, y cómo, desde el código Clojure. Por ejemplo, si usted tiene la siguiente clase,¿Es posible redefinir los métodos Java de Clojure?

public class Shape { 
    public void draw() { 
     ... 
    } 
} 

me gustaría ser capaz de ejecutar algo que añadir un antes método, como este:

(attach-to-method Shape/draw :before 
    (println "... about to draw a shape")) 

Y después de la evaluación de esa forma, todas las llamadas subsiguientes para dibujar comenzarían a imprimir una cadena antes de realizar la llamada.

Mi propósito con este adjunto de antes/después/alrededor, comportamiento similar a AOP, es que un marco que llama a ese método en una instancia existente se puede cambiar dinámicamente y comenzar a ejecutar el código recién agregado. Actualmente estoy usando AspectJ para eso, pero estoy llegando al punto en que usar un compilador diferente no es una opción, y tengo curiosidad por saber si puedo deshacerme de AspectJ.

Respuesta

8

Respuesta corta: No.

Como en Java, la única manera de modificar una clase es extender (subclase) de ella. Puede ampliar Shape y anular el método draw (suponiendo que draw no está declarado final). En Clojure, esto se puede lograr con proxy o gen-class.

+0

Ok, gracias. Sabía de 'proxy' y' gen-class', solo quería asegurarme de que la redefinición de métodos aún no estaba disponible en Clojure. Tenía alguna esperanza de que algunos cambios recientes de JVM desconocidos cuya existencia desconocía podría permitirlo, pero supongo Tendré que quedarme con AspectJ, entonces. ¡Gracias, Stuart y Brian! – Edgar

3

Si no puede hacerlo en Java, no puede hacerlo en Clojure.

+3

¿No es más como "si no puedes hacerlo en la JVM, no puedes hacerlo en Clojure"? Y así sí, supongo que puedo reformular mi pregunta a "es posible en la JVM", en lugar de en Clojure. Solo filtre el idioma porque quería saber si ya se han realizado esfuerzos para abordar este problema en Clojure, específicamente. – Edgar

Cuestiones relacionadas