繁体   English   中英

什么是Java中的“公共静态最终”常量的Clojure等价物

[英]What is the Clojure equivalent of a “public static final” constant in Java

我正在编写一些依赖于许多常量的Clojure代码。

它们将在紧密的内部循环中使用,因此通过Clojure编译器+ JVM组合尽可能高效地使用和优化它们非常重要。 我通常会在Java中使用“public static final”常量来达到同样的目的。

申报这些的最佳方式是什么?

我认为def全局命名空间-ing的事情是最接近你能来。

我相信Clojure 1.3(或者1.4)允许你在def上放置一个^:constant标记,这表示编译器应该是一个常量,所有引用都应该在编译时解析。

编辑

显然它是Clojure 1.3,它是^:const ,而不是^:constant 请参阅Clojure ^:const如何工作? 总结。

没有defconst ,所以只使用全局def是惯用的; 就优化而言,JIT会让事情变得更快。

如果真的,真的,真的想要常量(我相信,JIT会注意到值是不变的并做正确的事情),你可以使用宏。

(defmacro my-constant [] 5)

这是相当丑陋的,但我认为性能关键代码总是很难看。

(do-stuff (my-constant) in-place)

但要注意你放入宏中的内容! 我不会超过一些文字常量。 特别是不是对象。

如果只使用def不够快,你可以尝试在进入紧密循环之前创建一个let绑定别名,以避免每次都通过var。

如上所述使用def或atom,记住,数据是不可变的,所以如果你在列表中声明一些常量,它们就不会改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM