请分享您的想法,参加2024年Clojure状态调查!(此处为链接)

欢迎!请参阅关于页面以了解更多关于本站如何运作的信息。

+1
编译器
编辑

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

ClojureDocs对gen-class的解释指出,state字段将是公开的

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

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

2 答案

+4

被选中
 
最佳答案

简而言之,不是。正如您在文档中提到的,使用gen-class创建的状态字段将是public final类型的字段。然而,该字段可以是(例如),在实现方法中按状态修改的atom类型。一般来说,我们不太关注Clojure中的封装,而是更倾向于使事物更透明,但“安全”(通过不可变性)。正如Rich在https://clojure.org/reference/datatypes中所言,“封装是愚蠢的”。

gen-class不是用于生成所有Java类的通用领域特定语言(DSL)。它是一个在遵循Clojure美学风格的工具,用于生成特定风格的类。

然而,实现类似功能的另一条路径是使用deftype,它可以具有私有可变字段,通过实现接口或协议内部可见。deftype字段可以具有^:volatile-mutable或^:unsynchronized-mutable的元数据,这两种都能使字段私有。

+1

除去带有可变字段的deftype之外,您还可以求助于类似JiSE的库来在定义类时获得更多控制。这并不常见,但可能在某些情况下有用。

...