Реализация интерфейсов и вызов констант Java в Clojure (новичок)

Я пытаюсь написать оболочку для API Google Adwords в Clojure, но борюсь с константами и интерфейсами. Java-код выглядит так:

CampaignServiceInterface campaignService =
    user.getService(AdWordsService.V201109.CAMPAIGN_SERVICE);

Обычно вы можете вызывать константы в Clojure, например, с помощью (Математика/PI), но когда я пишу:

(def user (AdWordsUser. ))
(.getService user (AdWordsService/V201109/CAMPAIGN_SERVICE))

Я просто получаю «нет такого пространства имен». Также я немного не понимаю, как правильно реализовать интерфейс. Я думаю, что мне следует использовать «reify», но я застреваю.

Ссылка на интерфейс: http://google-api-adwords-java.googlecode.com/svn-history/r234/trunk/docs/com/google/api/adwords/v201003/cm/CampaignServiceInterface.html

(defn campaign-service [ ]
(reify 
  com.google.adwords.api.v201109.cm.CampaignServiceInterface
  (get [this] ??))))

person C.A    schedule 25.05.2012    source источник


Ответы (2)


Если я правильно понял, AdWordsService.V201109.CAMPAIGN_SERVICE — это статическая константа внутреннего класса класса AdWordsService.

Чтобы получить доступ к внутренним классам, вам нужно использовать внутреннюю схему изменения имен Java **; отделите внутренний класс от его внешнего класса знаком $:

AdWordsService$V201109/CAMPAIGN_SERVICE

** в JVM на самом деле нет понятия внутренних классов, поэтому java "подделывает" его, создавая автономный класс AdWordsService$V201109

person Joost Diepenmaat    schedule 25.05.2012
comment
Спасибо Йост! Думаю, теперь я понял! - person C.A; 25.05.2012

1. О доступе к константам. Вы импортировали AdWordsService? Если нет, вы можете либо получить доступ к AdWordsService с полным именем: some.package.name.AdWordsService/V201109/CAMPAIGN_SERVICE, либо импортировать его через import. макрос.

2. Посмотрите примеры здесь: http://clojuredocs.org/clojure_core/clojure.core/reify

(defn campaign-service [ ]
(reify   
  com.google.adwords.api.v201109.cm.CampaignServiceInterface
  (get [_ selector] (some-function selector))
  (mutate [_ operations] (some-function-2 operations))))
person Mikita Belahlazau    schedule 25.05.2012
comment
Привет, Никита, да, я импортировал его, и я попробую твой способ. Спасибо за пример интерфейса! - person C.A; 25.05.2012