在Clojure中调用Java类静态方法:类级doto宏替代方案问询
针对类静态方法的"doto"式解决方案
问题出在默认的doto宏的设计逻辑上:它是专为实例对象打造的——它会把第一个参数作为后续所有方法调用的隐式this目标,但静态方法不属于任何实例,而是绑定在类本身上的。所以你写(setA "a")时,Clojure会把它当成一个独立的函数调用,自然找不到setA这个符号,报错也就不奇怪了。
目前Clojure标准库没有专门针对类静态方法的内置"doto"宏,但我们可以自己实现一个,或者用更直接的写法解决:
方案1:自定义doto-static宏
这个宏会帮你自动把后续的方法调用绑定到目标类上,用法和原生doto类似:
(defmacro doto-static [class & forms] `(do ~@(map (fn [form] ;; 处理每个方法调用形式,转换成静态方法调用语法 (if (seq? form) `(. ~class ~(first form) ~@(rest form)) form)) forms) ~class))
用它来调用你的静态方法就完全没问题了:
(doto-static MyClass (.setA "a") (.setB "b"))
方案2:直接用do块(无需自定义宏)
如果只是少数几个静态方法要调用,直接写do块也很清晰,虽然重复了类名,但足够直观:
(do (. MyClass setA "a") (. MyClass setB "b") MyClass) ;; 可选:如果需要返回类对象的话
两种方案都能实现你想要的"连续调用静态方法"的效果,根据自己的场景选就行~
内容的提问来源于stack exchange,提问作者user12341234
相关产品推荐
相关产品推荐

