Clojure 多方法与 Java 交互全解析
多方法(Multimethods)
多方法支持任意调度,通常基于类型关系工作。有时这些类型是正式的,如 Java 类;有时则是非正式的、临时的,从系统中对象的属性中产生。我们可以通过调度身份来编写自己版本的类作为多方法,示例代码如下:
(defmulti my-class identity)
(defmethod my-class nil [_] nil)
(defmethod my-class :default [x] (.getClass x))
任何空检查都可以用这种方式重写,但原有的 class
函数比多方法版本更易读。在决定是创建函数还是多方法时,可以遵循以下一般规则:
1. 如果一个函数基于一个或多个类型进行分支,考虑使用多方法。
2. 类型可以是你发现的任何类型,不必是显式的 Java 类或数据标签。
3. 你应该能够在不参考 defmulti
的情况下解释 defmethod
的调度值。
4. 不要仅仅为了处理可选参数或递归而使用多方法。
当有疑问时,尝试用两种风格编写函数,然后选择看起来更易读的那种。
Clojure 与 Java 的交互
Clojure 对 Java 的支持强大而精简。它强大在于带来了 Lisp 语法的表现力,以及一些专为 Java 定制的语法糖;精简在于它可以直接触及底层。Clojure 代码编译成字节码,无需经过任何特殊的翻译层就能