15

プロキシと具象化の違いは何ですか?私はいくつかのサンプルコードを持っています:

(.listFiles (java.io.File. ".")
  (proxy
    [java.io.FileFilter] []
    (accept [f]
      (.isDirectory f))))

(.listFiles (java.io.File. ".")
  (reify
    java.io.FileFilter
    (accept [this f]
      (.isDirectory f))))

結果は同じですが、プロキシまたは具象化を使用する場合、何が良いですか?

アップデート:

私は何かを見つけました:

  • プロキシはthis最初のパラメータとして必要ありません。
  • プロキシサポートスーパークラス。
  • プロキシサポート引数。
4

1 に答える 1

21

Clojure.org のデータ型の概要から:

のメソッド本体reifyはレキシカル クロージャであり、周囲のローカル スコープを参照できます。reify次の点で異なりますproxy

  • プロトコルまたはインターフェースのみがサポートされており、具体的なスーパークラスはサポートされていません。
  • メソッド本体は、結果のクラスの真のメソッドであり、外部 fn ではありません。
  • インスタンスでのメソッドの呼び出しは、マップ ルックアップを使用せずに直接行われます。
  • メソッド マップでのメソッドの動的スワップはサポートされていません。

その結果proxy、構築と呼び出しの両方で よりも優れたパフォーマンスが得られます。その制約が禁止されていないすべての場合にreify適しています。proxy

ソース: http://clojure.org/datatypes

于 2012-06-13T08:25:15.750 に答える