Clojure中初始化Java对象的惯用方式

6
我正在寻找一种Clojure特有的方式来初始化一个Java对象。我有以下代码:
(let [url-connection
      (let [url-conn (java.net.HttpURLConnection.)]
        (doto url-conn
          (.setDoInput true)
          ; more initialization on url-conn
          )
        url-conn)]
  ; use the url-connection
  )

但是看起来非常尴尬。

创建HttpURLConnection对象并在稍后的代码中使用之前,有更好的初始化方法吗?

更新:看起来(doto ...)可能会很方便:

(let [url-connection
        (doto (java.net.HttpURLConnection.)
          (.setDoInput true)
          ; more initialization
          ))]
  ; use the url-connection
  )

根据 doto 的文档,它返回它正在 "做" 的值。
2个回答

4

正如我在问题更新中所解释的那样,这是我想出的答案:

(let [url-connection
        (doto (java.net.HttpURLConnection.)
          (.setDoInput true)
          ; more initialization
          ))]
  ; use the url-connection
  )

也许有人能想出更好的解决方案。

1
我没有读过Barski的书,但是CL确实有数组和哈希表。而且我认为,至少在这一点上,Clojure可能很难匹配更快的CL实现的效率。 - Tagore Smith
2
但我也会说Clojure对数据类型的处理比CL更加一致。在我看来,Clojure这方面的设计比CL更好。 - Tagore Smith
1
你说得对,对于很多事情来说,超高效并不是那么重要的(虽然有时候确实很重要,我很高兴看到很多人在努力让Clojure更加高效)。我主要是因为从很多关于CL的书籍中容易给人留下错误的印象而进行评论。在CL中,你可以以非常列表导向的方式进行编程(对于某些事情来说这可能相当低效),但这并不是全部。生产环境中的CL通常看起来会截然不同。 - Tagore Smith
1
我应该补充说,我完全同意你的观点,例如Clojure中的文字语法和尤其是美妙的序列抽象确实可以让很多事情在Clojure中更加舒适。我不认为使用过很多CL的人会把它与“完美”这个词联系起来;)。CL有很多缺陷,虽然其中许多在你熟悉语言后变得不那么重要,但有些仍然很烦人-有些情况下非常烦人。但是话说回来,至少对我来说,Clojure和CL都没有严格主导另一个。尽管存在缺陷,CL也有很多优点。 - Tagore Smith
你可以随时在应用程序后面添加更多的服务器,但是你不能在项目上放置任意数量的人,因此我认为语言表达性因素的重要性在大多数情况下超过了效率的重要性。而且,Clojure不必为所有内容使用括号,这比CL更易于使用。 - Adam Arold
显示剩余6条评论

3
假设没有接受所需初始化参数的构造函数,那么您所做的方式是我所知道的唯一方法。
您可以做的一件事是将所有内容包装在如下函数中:
(defn init-url-conn [doInput ...other params..] 
     (let [url-conn (java.net.HttpURLConnection.)]
        (doto url-conn
          (.setDoInput true)
          ; more initialization on url-conn
          )
        url-conn))

并使用以下方式进行调用:

(let [url-connection
      (let [url-conn (init-url-con true ...other params..)]
  ; use the url-connection
  )

然而,这是针对每个对象具体的,只有当你初始化该类的对象超过一次时才真正有用。

另外,您可以编写一个接受所有方法名称和参数并执行此操作的宏。但是,当调用时,该调用不会比您的第一个示例更短。

如果有更好的想法,我很想看到它,因为我最近也在思考同样的问题。


1
是的。而doto的文档也有类似的例子:(doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2)) - Goran Jovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接