2010-08-08 22 views
6

Utilizzando multimethods siamo in grado di aggiungere metodi a classi Java esistenti. La mia domanda è se sia possibile ridefinire un metodo specifico e come, dal codice Clojure. Per esempio, se avete la seguente classe,È possibile ridefinire i metodi Java da Clojure?

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

Mi piacerebbe essere in grado di eseguire qualcosa da aggiungere un prima metodo, come questa:

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

E dopo aver valutato quella forma, tutte le chiamate successive a disegnare inizierebbero a stampare una stringa prima di eseguire la chiamata stessa.

Il mio scopo con questo allegato di prima/dopo/intorno, comportamento simile a AOP, è che un framework che chiama quel metodo su un'istanza esistente può essere modificato dinamicamente e avviare l'esecuzione del codice appena allegato. Attualmente sto usando AspectJ per questo, ma sto arrivando a un punto in cui l'utilizzo di un compilatore diverso non è un'opzione, e sono curioso di sapere se posso semplicemente abbandonare AspectJ.

risposta

8

Risposta breve: No.

Come in Java, l'unico modo per modificare una classe è quello di estendere (sottoclasse) esso. È possibile estendere Shape e sovrascrivere il metodo draw (supponendo che draw non sia dichiarato final). In Clojure, questo può essere realizzato con proxy o gen-class.

+0

Ok, grazie. Sapevo di 'proxy' e' gen-class', volevo solo assicurarmi che la ridefinizione dei metodi non fosse ancora disponibile su Clojure - avevo qualche speranza che alcuni oscuri cambiamenti della JVM di cui non ero a conoscenza potevano abilitarlo, ma credo Dovrò restare con AspectJ, quindi. Grazie, Stuart e Brian! – Edgar

3

Se non è possibile farlo in Java, non è possibile farlo in Clojure.

+3

Non è più come "se non puoi farlo nella JVM, non puoi farlo in Clojure"? E quindi sì, suppongo di poter riformulare la mia domanda su "è possibile nella JVM", invece che in Clojure. Ho solo filtrato la lingua perché volevo sapere se erano già stati fatti sforzi per affrontare questo problema su Clojure, in particolare. – Edgar

Problemi correlati