Я начинаю больше разбираться в взаимодействии Clojure-Java. Если я создаю класс Java в Clojure, мне нужно его импортировать, но если я просто использую поля или методы класса, мне не нужно его импортировать. Например:
(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)))))
Это не скомпилируется без импорта Double2D
, потому что код создает экземпляр Double2D
.
Однако тот факт, что я обращаюсь к полю yard
и методу setObjectLocation()
экземпляра Students
, а также к полям width
и height
экземпляра Continuous2D
, не вызывает проблем, хотя я не импортирую классы Students
или Continuous2D
.
Означает ли это, что Clojure использует отражение во время выполнения для доступа к полям и методам Java? Это неэффективно? Если мне нужна скорость в функции, может быть выгодно добавить объявления типов для классов Java вместе с отсутствующими операторами импорта? Помешает ли это рефлексии?
[РЕДАКТИРОВАТЬ: Как следует из моего второго комментария к ответу Артура Ульфельдта, теперь я думаю, что любая неэффективность, возникающая из-за незнания классов во время компиляции, вероятно, не сильно отличается от неэффективности, связанной с тем, что функции содержатся в переменных. Если бы меня беспокоил это, я бы забыл о Clojure и программировал на чистой Java (возможно), вместо того, чтобы пытаться использовать Java-библиотеки из Clojure. Для меня мир, в котором я могу использовать Clojure вместо Java, лучше.]