2010-12-17 13 views
3

Ich habe eine Anwendung in Clojure, die ein Java-Framework namens Vaadin verwendet. Vaadin verwendet mehrere Callbacks mit der Java "Proxy" -Funktion von Clojure. Jedes Mal, wenn ein Proxy in einer Clojure-Funktion aufgerufen wird, gibt es jedoch eine signifikante Verzögerung (manchmal 100 ms). Kann ich das irgendwie beschleunigen?Langsame Aufrufe an Clojure Proxy

+0

Haben Sie versucht, die Art Hinweise setzen? –

+0

Meinst du das Hinzufügen von Typhinweisen für den Proxy-Namen oder die Methodenargumente für die implementierten Methoden? – Zubair

+0

Aktivieren Sie einfach 'warn-on-reflection' und geben Sie Typhinweise, um alle Warnungen zu entfernen. –

Antwort

6

Meines Wissens ist das neue reify Makro schneller als proxy. Sie können es verwenden, wenn Sie nur eine einzige Schnittstelle implementieren müssen.

Zum Beispiel, wenn Sie ein java.awt.event.ActionListener implementieren möchten, können Sie Code wie den folgenden verwenden:

(import 'java.awt.event.ActionListener 'javax.swing.JButton) 
(let [a-button (JButton. "Click Me")] 
    (.addActionListener a-button 
    (reify ActionListener 
     (actionPerformed [this ev] (comment do something interesting))))) 
+0

Aus irgendeinem Grund funktioniert die Verify nicht auf der Vaadin-Schnittstelle com.vaadin.ui.Button $ ClickListener. Ist das becomuase com.vaadin.ui.Button $ ClickListener ist eine statische Schnittstelle? – Zubair

+0

@Zubair: Nicht sicher. Ich musste eine Zeit lang mit der Verify-Funktion herumspielen, bevor ich es zur Arbeit brachte. Das letzte, was ich getan habe, war die 'this' Variable hinzuzufügen. Welchen Fehler hast du bekommen? – Ralph

+5

Eigentlich kann man mehrere Interfaces in einem einzigen 'verify' Formular implementieren. Die Einschränkung gegenüber "proxy" ist, dass 'reif 'die Klassen nicht erweitern kann. –

Verwandte Themen