【问题标题】:Have clojure generate a java class which is used like a builder pattern让 clojure 生成一个 java 类,它像构建器模式一样使用
【发布时间】:2016-11-16 00:41:49
【问题描述】:

我正在尝试使用 clojure 来构建一个 java 库。我希望该类符合 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] } })

有没有一种方法可以声明一个返回值,该返回值将返回不会引发错误的类本身?

【问题讨论】:

    标签: java clojure leiningen


    【解决方案1】:

    这是一个已知的bug

    这就是我在类文件中解决它的方法,添加两次 gen-class

       (: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"]
    

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2015-07-04
      • 2011-03-29
      相关资源
      最近更新 更多