2016-11-16 52 views
2

我想用clojure來建立一個java庫。我希望該類符合java規範,這意味着我期望構建器模式是最直觀的。使用它的庫將調用它像這樣有clojure生成一個java類,它像一個建設者模式使用

String actualHtml = 
     builder 
     .setTitle("Pizza Time") 
     .setProperty(n) 
     .setProperty(n+1) 
     .build(); 

一個奇怪的編譯步驟,我能得到這個在每個擦除方法的返回值,編譯,然後將其添加,並再次編譯編譯.....但我想知道是否有更標準的方法。

(ns scorecard.core 
    (:gen-class 
    :name scorecard.Builder 
    :state state 
    :init init 
    :methods [[setTitle [String] scorecard.Builder ] 
      [[setProperty [String] scorecard.Builder ] 
       [build [] String ]])) 

以上將失敗,並

Exception in thread "main" java.lang.ClassNotFoundException: scorecard.Builder, compiling:(scorecard/core.clj:1:1) 

如果我刪除的返回值進行編譯,然後重新編譯它的工作原理。我試圖添加一個預編譯配置文件,但依賴關係與:gen-class方法在同一個文件中。

:profiles { :precomp { 
         :source-paths ["src/scorecard"] 
         :aot [parser.ast] } }) 

有沒有一種方法可以聲明一個返回值,它將返回不會拋出錯誤的類本身?

回答

2

這是一個已知bug

這是我如何解決它在我的類文件中添加根級兩次

(:gen-class 
    :name scorecard.Builder) 

    (:gen-class 
    :name scorecard.Builder 
    :state state 
    :init init 
    :methods [[setTitle [String] scorecard.Builder ] 
    [build [] String ]]) 

然後在我project.clj文件中添加prep-task預編譯。這使您可以針對課程運行測試。

:prep-tasks [["compile" "scorecard.core"] 
       "javac" "compile"] 
相關問題