让 clojure 生成一个 java class ,它像构建器模式一样使用
Have clojure generate a java class which is used like a builder pattern
我正在尝试使用 clojure 构建一个 java 库。我希望 class 符合 java 规范,这意味着我希望构建器模式是最直观的。使用它的图书馆会这样称呼它
String actualHtml =
builder
.setTitle("Pizza Time")
.setProperty(n)
.setProperty(n+1)
.build();
通过一个奇怪的编译步骤,我可以通过擦除每个方法中的 return 值来编译它,编译,然后添加它们并再次编译......但我想知道如果有更标准的方法。
(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)
如果我删除 return 值编译,然后再次编译它就可以了。我试图添加预编译配置文件,但依赖项与 :gen-class 方法位于同一文件中。
:profiles { :precomp {
:source-paths ["src/scorecard"]
:aot [parser.ast] } })
有没有一种方法可以声明一个 return 值,该值 return class 本身不会引发错误?
这是已知的bug
这就是我在 class 文件中解决问题的方法 添加 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
进行预编译。这允许您针对 class 进行 运行 测试。
:prep-tasks [["compile" "scorecard.core"]
"javac" "compile"]
我正在尝试使用 clojure 构建一个 java 库。我希望 class 符合 java 规范,这意味着我希望构建器模式是最直观的。使用它的图书馆会这样称呼它
String actualHtml =
builder
.setTitle("Pizza Time")
.setProperty(n)
.setProperty(n+1)
.build();
通过一个奇怪的编译步骤,我可以通过擦除每个方法中的 return 值来编译它,编译,然后添加它们并再次编译......但我想知道如果有更标准的方法。
(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)
如果我删除 return 值编译,然后再次编译它就可以了。我试图添加预编译配置文件,但依赖项与 :gen-class 方法位于同一文件中。
:profiles { :precomp {
:source-paths ["src/scorecard"]
:aot [parser.ast] } })
有没有一种方法可以声明一个 return 值,该值 return class 本身不会引发错误?
这是已知的bug
这就是我在 class 文件中解决问题的方法 添加 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
进行预编译。这允许您针对 class 进行 运行 测试。
:prep-tasks [["compile" "scorecard.core"]
"javac" "compile"]