刚开始使用Clojure时,我遇到了类似的问题。我几年前做了一些Java开发,但是对那里的库还是很陌生。
介绍
我发现使用Java的最简单方法是不 真正 使用它。我认为刚开始使用Clojure的Java会有点书本。除非真正开始学习JVM /
Java库,否则您实际上并不需要了解太多。让我解释。
花更多时间学习如何内外使用Clojure,并熟悉Clojure-Contrib。例如,在clojure.contrib
sqrt
中的generic.math函数中。
实际上,您需要的许多东西已经在Clojure中了-但还有很多东西还没有。
熟悉使用Java的Clojure中的调用约定和语法糖。例如
Math/sqrt,按照您的示例,正在
sqrt从class
调用静态方法(基本上只是一个函数)
Math。
无论如何,如果您发现自己 确实 需要使用Java ,这里的指南应该可以帮助您入门。我将假设您已经完成了 一些
命令式的OO编程,但除此之外没有其他很多。即使没有,您也应该没事。
艾萨克的Clojurist Java指南
班级
一个类是一堆方法(作用在该类上的函数),它们也可以是数据类型:例如,创建一个类型为的新类
Double:
(Double.1.2)它初始化类Double(句号是调用类构造函数的语法糖)方法,这些方法使用value提供的值初始化类
1.2。
现在,查看Java 6 API 中的
Double类:
Doublepublic 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用value “构建”了一个新值
1.2,它是double
值。有点令人困惑,但实际上Double是一个代表Double的类,可以做与double有关的事情。
静态方法
例如,要从字符串中解析Double值,我们可以使用static方法(这意味着我们不需要的特定实例
Double,我们可以像调用一样调用它
sqrt)
parseDouble(Strings):
(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对象来处理。让我们看看文档是如何工作的:
toUpperCasepublic String toUpperCase()Converts all of the characters in this String to upper case using the rules of the default locale. This method is equivalent totoUpperCase(Locale.getDefault()).Returns:the String, converted to uppercase.
因此,这里有一个返回字符串的方法(如定义中的public之后的“
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在文档中都列为的方法(或其超类……暂时不用担心)。
包起来
这应该为您现在亲自探索JavaDocs做准备。在这里,您将找到标准Java
1.6安装中可用的所有内容。将会有新的概念,但是快速的Google搜索应该可以回答您的大多数问题,您总是可以在这里找到特定的问题。
一定要研究其他重要的Clojure函数,例如
proxy和
reify以及
extend-type及其朋友。我不经常使用它们,但是当我需要时,它们可能是无价的。实际上,我本人仍在理解它们。
那里有一吨,但这主要是数量而不是复杂性的问题。这不是一个坏问题。
补充阅读:
- 静态还是非静态?;; 静态与非静态方法指南
- Java类库;概述了那里发生的事情,并提供了一张漂亮的照片
- JavaDocs ;; 链接上方
- Clojure Java Interop文档;; 从Clojure网站



