我开始更多地了解 Clojure-Java 互操作。如果我在 Clojure 中创建一个 Java 类,我需要导入它,但如果我只是使用类的字段或方法,我不必导入它。例如:
(ns students.Student
(:import [sim.util Double2D])
(defn -step
[this students] ; students is a students.Students, extends sim.engine.SimState
(let [yard (.-yard students) ; a sim.field.continuous.Continuous2D
yard-width (.-width yard)
yard-height (.-height yard)]
(.setObjectLocation yard this (Double2D. (/ yard-height 2) (/ yard-width 2)))))
这不会在没有 import 的情况下编译Double2D
,因为代码会创建一个Double2D
实例。
但是,我访问实例的yard
字段和setObjectLocation()
方法以及Students
实例的字段width
和height
字段这一事实Continuous2D
不会导致任何问题,即使我不导入Students
或Continuous2D
类。
这是否意味着 Clojure 在运行时使用反射来访问 Java 字段和方法?那效率低吗?如果我需要函数的速度,是否可以为 Java 类添加类型声明以及缺少的导入语句?这会阻止反射吗?
[编辑:正如我对 Arthur Ulfeldt 回答的第二条评论所暗示的那样,我现在认为,由于在编译时不知道类而导致的任何低效率可能与函数包含在变量中这一事实所导致的低效率没有太大区别。如果我担心这一点,我会忘记 Clojure 和纯 Java 编程(也许),而不是尝试使用 Clojure 中的 Java 库。对我来说,一个我可以使用 Clojure 而不是 Java 的世界是一个更好的世界。]