欢迎!请查看关于页面以了解该页面是如何工作的更多相关信息。
如何在Clojure中创建具有私有final字段的Java类?
ClojureDocs中的gen-class说明state字段将是公有的
state
:state name - 如果提供,将创建一个具有指定名称的公开final实例字段。
换句话说,我们是否有创建一个类并封装状态实例化Java对象的方法?
简而言之,不是。正如你在文档中提到的,生成类(gen-class)的成员变量将是公开且不可变的字段。然而,该字段可以是(例如),一个由实现方法有状态修改的原子。一般而言,Clojure不十分重视封装 - 相反地,我们更喜欢让事物可见,但“安全”(通过不可变性)。引用Rich在https://clojure.org/reference/datatypes的话:“封装是愚蠢的”。
gen-class 不是一个用于生成所有可能Java类的通用领域特定语言(DSL)。它是生成特定风格的类的工具,与Clojure的美学相一致。
然而,另一种实现类似功能的方法是使用deftype,它可以有私有可变字段,通过内联实现接口或协议来暴露。这些类型字段可以有^:volatile-mutable或^:unsynchronized-mutable的元信息,这两个都将成为私有字段。
除了具有可变字段的deftype之外,你还可以求助于像JiSE这样的库来获取对定义类的更多控制。这并不常见,但也许在某些情况下可能会有所帮助。