2010-12-17 7 views
3

私は、Vaadinと呼ばれるJavaフレームワークを頻繁に使用するアプリケーションをclojureに持っています。 Vaadinは、clojureのJava "proxy"機能を使用していくつかのコールバックを使用します。しかし、クロージャー機能でプロキシが呼び出されるたびに、かなりの遅延があります(時には100ミリ秒になります)。私はこれをスピードアップできる方法はありますか?clojureプロキシへの呼び出しが遅い

+0

あなたはタイプヒントを入れてみましたか? –

+0

プロキシ名の型ヒントや実装されたメソッドのメソッド引数を追加することを意味しますか? – Zubair

+0

すべての警告を削除するには、 'warn-on-reflection'をオンにしてタイプヒントを入れてください。 –

答えて

6

新しいreifyマクロは、proxyよりも高速です。単一のインタフェースを実装するだけでよい場合に使用できます。例えば

、あなたがjava.awt.event.ActionListenerを実装する必要がある場合は、次のようなコードを使用することができます。

(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

何らかの理由でreifyがVaadinインターフェースのcom.vaadin.ui.Button $ ClickListenerで動作しませんでした。これはビーコンですか?com.vaadin.ui.Button $ ClickListenerは静的なインターフェースですか? – Zubair

+0

@Zubair:わかりません。私はそれを動作させる前にreify関数をしばらく使っていなければなりませんでした。最後に 'this'変数を追加しました。どのようなエラーがありましたか? – Ralph

+5

実際、1つの 'reify'形式で複数のインタフェースを実装することができます。 'proxy'に対する制限は' reify'がクラスを拡張することができないということです。 –

関連する問題