Реализация интерфейсов и вызов констант 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))))
Другие вопросы по тегам