Реализация интерфейсов и вызов констант Java в Clojure (новичок)
Я пытаюсь написать оболочку для API Google AdWords в Clojure, но борюсь с константами и интерфейсами. Код Java выглядит следующим образом:
CampaignServiceInterface campaignService =
user.getService(AdWordsService.V201109.CAMPAIGN_SERVICE);
Обычно вы можете вызывать константы в Clojure с помощью, например, (Math/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] ??))))
2 ответа
Если я правильно прочитал, AdWordsService.V201109.CAMPAIGN_SERVICE
является статической константой внутреннего класса класса AdWordsService.
Чтобы получить доступ к внутренним классам, вам нужно использовать внутреннюю схему искажения имен в java **; отделить внутренний класс от его внешнего класса знаком $:
AdWordsService$V201109/CAMPAIGN_SERVICE
** JVM на самом деле не имеет представления о внутренних классах, поэтому java "подделывает" его, создавая отдельный класс AdWordsService$V201109
1. О доступе к константам. Вы импортировали AdWordsService
? Если нет, вы либо можете получить доступ AdWordsService
с полным именем: some.package.name.AdWordsService/V201109/CAMPAIGN_SERVICE
Или импортируйте его с помощью макроса импорта.
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))))