1

我正在尝试在 Clojure 中为 google adwords api 编写一个包装器,但在常量和接口方面遇到了困难。Java 代码如下所示:

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

通常你可以用例如 (Math/PI) 在 Clojure 中调用常量,但是当我写的时候:

(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] ??))))
4

2 回答 2

4

如果我没看错的话,它AdWordsService.V201109.CAMPAIGN_SERVICE是 AdWordsService 内部类的一个静态常量。

要访问内部类,您需要使用 java 的内部名称修饰方案**;用 $ 符号将内部类与其外部类分开:

AdWordsService$V201109/CAMPAIGN_SERVICE

** JVM 实际上并没有内部类的概念,所以 java 通过创建一个独立的类来“伪造”它AdWordsService$V201109

于 2012-05-25T09:33:50.177 回答
1

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))))
于 2012-05-25T07:53:14.800 回答