请在 Clojure 2024年调查 中分享您的想法!

欢迎!请参阅 关于 页面以获取更多有关此内容的信息。

+1
编译器
编辑

如何在Clojure中创建一个带有私有final字段的Java类?

ClojureDocs关于gen-class说明,状态字段将是公开的

:state name - 如果提供,将创建具有给定名称的公开final实例字段。

换句话说,我们是否有创建一个类并实例化带有封装状态Java对象的方法?

2 个答案

+4

被选中
 
最佳答案

简而言之,不是。正如你在文档中提到的,gen-class 的状态字段将是公共 final 字段。然而,这个字段可以是(例如),一个状态实现方法修改的原子。总的来说,我们在 Clojure 中并不会过于重视封装——我们更倾向于使事物变得可见,但“安全”(通过不可变性)。就像 Rich 在 https://clojure.org/reference/datatypes 中说的,“封装是荒谬的”。

gen-class 不是一个生成所有可能 Java 类的通用 DSL。它是一个生成与 Clojure 风格一致的类的工具。

但是,还有一种类似的方法,那就是使用 deftype,它可以有私有可变字段,通过实现内联接口或协议来暴露。deftype 字段可以有 ^:volatile-mutable 或 ^:unsynchronized-mutable 的元数据,两者都将变为私有字段。

+1

除了具有可变字段的 deftype 之外,你也可以求助于像 JiSE 这样的库来获得更好的类定义控制。这并不常见,但在某些情况下可能很有用。

...