Ответ 1
У меня были подобные проблемы, когда я впервые начал использовать Clojure. Я несколько лет назад занимался разработкой Java, но до сих пор не знаком с библиотеками.
Введение
Я считаю, что самый простой способ использовать Java - это не использовать его. Я думаю, что книга будет немного больше, чтобы начать работу с Java с Clojure. Существует не так много, что вам действительно нужно знать, если вы действительно не начнете спускаться в библиотеки JVM/Java. Позвольте мне объяснить.
Потратьте больше времени на изучение использования Clojure внутри и снаружи и ознакомьтесь с Clojure -Contrib. Например, sqrt
находится в generic.math-functions в Clojure.contrib.
Многие из вещей, которые вам понадобятся, на самом деле уже находятся в Clojure, но все же их нет.
Ознакомьтесь с соглашениями о вызовах и синтаксическим сахаром в Clojure для использования Java. например Math/sqrt
, в соответствии с вашим примером, вызывает статический метод (который только функция, в основном) sqrt
из класса Math
.
В любом случае, вот руководство, которое должно помочь вам начать работу, если вам действительно нужно использовать Java. Я собираюсь предположить, что вы сделали какое-то обязательное программирование OO, но не намного больше. И даже если вы этого не сделали, вы должны быть в порядке.
Руководство по Java-программисту на Java
Классы
Класс - это набор методов (функций, действующих на класс), которые
также может быть типом данных: например, для создания нового класса типа Double
: (Double. 1.2)
, который инициализирует класс Double (период является синтаксическим сахаром для вызова методов конструктора класса, которые инициализируют класс со значениями, которые вы предоставляете) значением 1.2
.
Теперь рассмотрим Double
класс в Java 6 API:
Double
public Double(double value)
Constructs a newly allocated Double object that represents the
primitive double argument.
Parameters:
value - the value to be represented by the Double.
Итак, вы можете видеть, что там произошло. Вы "построили" новый Double
со значением 1.2
, который является двойным. Немного смущает там, но на самом деле Double - это класс, который представляет Double и может делать вещи, связанные с удвоениями.
Статические методы
Например, чтобы разобрать двойное значение из строки, мы можем использовать статический метод (это означает, что нам не нужен конкретный экземпляр Double
, мы можем просто называть его, как мы назвали sqrt
) parseDouble(String s)
:
(Double/parseDouble "1.2") => 1.2
Не сложно это сделать.
Нестационарные методы
Предположим, мы хотим использовать класс Java, который мы инициализировали. Не слишком сложно:
(-> (String. "Hey there") ;; make a new String object
(.toUpperCase)) ;; pass it to .toUpperCase (look up -> to see what it does)
;; toUpperCase is a non-static method
=> "HEY THERE"
Итак, теперь мы использовали метод, который не является статичным, и для которого требуется реальный объект live String
. Давайте посмотрим, как говорят документы:
toUpperCase
public String toUpperCase()
Converts all of the characters in this String to upper case using
the rules of the default locale. This method is equivalent to
toUpperCase(Locale.getDefault()).
Returns:
the String, converted to uppercase.
Итак, у нас есть метод, который возвращает строку (как показано "String" после публики в определении и не принимает никаких параметров. Но подождите, это займет параметр. В Python это будет неявный параметр self
: это называется this
в Java.
Мы могли бы также использовать следующий метод: (.toUpper (String. "Hey there"))
и получить тот же результат.
Подробнее о методах
Поскольку вы имеете дело с изменяемыми данными и классами в Java, вы должны иметь возможность применять функции к классам (экземпляры классов, действительно) и не ожидать возвратного значения.
Например, скажем, что мы имеем дело с JFrame
из библиотеки javax.swing
. Нам может понадобиться сделать несколько вещей, а не с ним (вы обычно работаете со значениями, а не на них в функциональных языках). Мы можем, например:
(doto (JFrame. "My Frame!");; clever name
(.setContentPane ... here we'd add a JPanel or something to the JFrame)
(.pack) ;; this simply arranges the stuff in the frame–don't worry about it
(.setVisibleTrue)) ;; this makes the Frame visible
doto
просто передает свой первый аргумент всем другим функциям, которые вы ему поставляете, и передает его в качестве первого аргумента для них. Итак, здесь мы просто делаем много вещей для JFrame
, которые не возвращают ничего в частности. Все эти методы перечислены в качестве методов JFrame
в документации (или ее суперклассах... пока не беспокойтесь о них).
Завершение
Это должно подготовить вас к изучению the JavaDocs самостоятельно. Здесь вы найдете все, что доступно вам в стандартной версии Java 1.6. Появятся новые концепции, но быстрый поиск в Google должен отвечать на большинство ваших вопросов, и вы всегда можете вернуться сюда с конкретными.
Обязательно загляните в другие важные функции Clojure, такие как proxy
и reify
, а также extend-type
и его друзья. Я не часто их использую, но когда мне это нужно, они могут быть неоценимы. Я по-прежнему понимаю их сам.
Там тонна, но это в основном проблема объема, а не сложности. Это не плохая проблема.
Дополнительное чтение:
- Static или Nonstatic?;; руководство по статистике против нестатических методов.
- Библиотека классов Java;; обзор того, что там, с хорошим изображением
- JavaDocs;; связанный выше
- Clojure Java Interop Docs;; с веб-сайта Clojure
- Лучшие Java-книги;; как ответ clartaq