如何在Clojure中创建一个带有私有final字段的Java类?
gen-class的ClojureDocs表示state
字段将公开
:州名
如果提供,将使用具有给定名称的公共最终实例字段 创建。
那么,换句话说,我们是否有办法创建一个类,之后是一个封装状态的java对象?
答案 0 :(得分:0)
@alexmiller最近对此问题进行了回答here
简而言之,不。正如您在文档中提到的,gen-class状态字段将 是公开的最终字段。但是,该字段可以是(例如) 被实现方法有状态修改的原子。在 通常,我们不太重视Clojure中的封装- 而不是让事物可见,而是“安全”(通过 不变性)。引用来自 https://clojure.org/reference/datatypes,“封装是愚蠢的”。
gen-class不是用于生成所有可能的通用DSL Java类。它是一种用于生成特定样式的类的工具 符合Clojure的美学。
然而,遵循这些思路的另一种方法是使用 deftype,可以具有私有可变字段,由 内联实现接口或协议。 deftype字段可以 具有^:volatile-mutable或^:unsynchronized-mutable的meta, 这两个都将成为私有字段。