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_SERVICEAdWordsService クラスの内部クラスの静的定数です。

内部クラスにアクセスするには、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 に答える