【问题标题】:Call series of Java static methods from Clojure从 Clojure 调用一系列 Java 静态方法
【发布时间】:2018-03-31 16:41:39
【问题描述】:

假设我遇到了一个包含几个静态 setter 方法的类,我想连续调用它们。我正在寻找的功能类似于 doto 提供的功能,只是它必须在类而不是对象上工作:

(doto MyClass
      (setA "a")
      (setB "b"))

不幸的是,当我尝试这个时,我得到了RuntimeException: Unable to resolve symbol: setA。类有特殊的doto 宏吗?

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案1】:

    我将保留这个问题,因为我希望有一个更好的答案,但这是我自己开发的宏来解决这个问题:

    (defmacro doto-class
      "Calls a series of static methods on a class"
      [klass & forms]
      (cons 'do
            (for [f forms]
              `(. ~klass ~f))))
    

    扩展示例:

    (macroexpand-1
     '(doto-class MyClass
                  (setA "a")
                  (setB "b")))
    

    (do (. MyClass (setA "a"))
        (. MyClass (setB "b")))
    

    【讨论】:

    • 我的大脑被工作炒得焦头烂额,但我什么都想不出来,我写的宏基本上和你的一样。我怀疑这是一个如此罕见的用例,以至于没有考虑到它。我认为我不需要对静态方法的调用进行排序。
    【解决方案2】:

    如何从 Clojure 调用静态 Java 方法?像这样……

    (类名/静态方法参数*)

    例如,

    > (System/getProperty "java.vm.version")
    
    => "25.141-b15"
    

    我们想要一个宏,比如doto-static,它从(doto-static System (getProperty "java.vm.version")) 重新排列它,并且还允许调用链。

    这样的宏是...

    (defmacro doto-static [class-symbol & calls]
      (let [qualify (fn [method-symbol] (->> method-symbol
                                        (name)
                                        (str (name class-symbol) \/)
                                      (symbol)))
            elaborate (fn [[method-symbol & arg-exprs]]
                          (cons (qualify method-symbol) arg-exprs))]
              (cons 'do (map elaborate calls))))
    

    例如,

    > (doto-static System (getProperty "java.vm.version") (getProperty "java.vm.version"))
    
    => "25.141-b15"
    

    【讨论】:

    • 有趣!你知道这个宏是否比我之前发布的幼稚解决方案更有优势吗?如果是这样,那将是对这个答案的一个很好的补充。
    • @user12341234 你的更干净。它拥有的唯一优势是符合preferred syntax for static calls to Java。我没有得到你回答的重点,否则我不会发布这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多