2012-06-13 2 views
12

В чем разница между прокси-сервером и reify? У меня есть пример кода:В чем разница между прокси-сервером и reify?

(.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)))) 

результат такой же, когда используется прокси-сервер или reify, что лучше?

Update:

Я нашел кое-что:

  • прокси не нужен this в качестве первого параметра.
  • прокси поддержка суперкласса.
  • аргументы поддержки прокси.

ответ

17

От Clojure.org's overview of data types:

Способ тела reify являются лексические замыкания, и может относиться к окружающей локальной области. reify отличается от proxy в том, что:

  • только протоколы или интерфейсы поддерживаются, никаких конкретных суперкласса.
  • Тела метода являются истинными методами результирующего класса, а не внешнего fns.
  • Вызов методов на экземпляре напрямую, не используя поиск по карте.
  • Нет поддержки для динамической замены методов на карте методов.

В результате получается более высокая производительность, чем proxy, как в строительстве, так и при вызове. reify предпочтительнее proxy во всех случаях, когда его ограничения не являются запретительными.

Источник: http://clojure.org/datatypes

+0

спасибо, я должен более точно читать Clojure документы –