У меня были похожие проблемы, когда я впервые начал использовать Clojure. Я занимался разработкой Java много лет назад, но все еще был довольно незнаком с библиотеками.
Введение
Я считаю, что самый простой способ использовать Java - не действительно использовать его. Я думаю, что книги было бы немного больше, чтобы просто начать использовать Java из Clojure. Вам не нужно много знать, если только вы действительно не начнете изучать библиотеки JVM / Java. Позвольте мне объяснить.
Проведите больше времени, изучая, как использовать Clojure внутри и снаружи, и познакомьтесь с Clojure-Contrib. Например, sqrt
находится в generic.math-функциях в clojure.contrib.
Многие из вещей, которые вам понадобятся, на самом деле уже есть в Clojure, но, тем не менее, многих из них нет.
Познакомьтесь с соглашениями о вызовах и синтаксическим сахаром в Clojure для использования Java. например Math/sqrt
, согласно вашему примеру, вызывает статический метод (который, в основном, просто функция) sqrt
из класса Math
.
В любом случае, вот руководство, которое должно помочь вам начать работу, если вы обнаружите, что действительно нуждается в использовании 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.
Статические методы
Например, для анализа значения 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"
Итак, теперь мы использовали метод, который не является статичным, и для которого требуется настоящий, живой 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» после public в определении и не принимает параметров. Но подождите! Он принимает параметр. В Python это будет неявный параметр self
: в Java он называется this
.
Мы также могли бы использовать метод, подобный этому: (.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
(или его суперклассы… пока не беспокойтесь о них).
Завершение
Это должно подготовить вас к изучению JavaDocs самостоятельно.Здесь вы найдете все, что вам доступно в стандартной установке Java 1.6.Появятся новые концепции, но быстрый поиск в Google должен ответить на большинство ваших вопросов, и вы всегда можете вернуться сюда с конкретными.
Обязательно изучите другие важные функции Clojure, такие как proxy
иreify
а также extend-type
и его друзей.Я не часто их использую, но когда мне нужно, они могут быть неоценимы.Я до сих пор понимаю их на самом деле.
Там есть тонна, но это в основном проблема объема, а не сложности.Это не плохая проблема.
Дополнительное чтение: