是否可以使用Clojure的gen-class创建一个私有的最终字段?

时间:2017-08-02 12:30:36

标签: clojure private encapsulation gen-class

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

gen-class的ClojureDocs表示state字段将公开

  

:州名

     

如果提供,将使用具有给定名称的公共最终实例字段   创建。

那么,换句话说,我们是否有办法创建一个类,之后是一个封装状态的java对象?

1 个答案:

答案 0 :(得分:0)

@alexmiller最近对此问题进行了回答here

  

简而言之,不。正如您在文档中提到的,gen-class状态字段将   是公开的最终字段。但是,该字段可以是(例如)   被实现方法有状态修改的原子。在   通常,我们不太重视Clojure中的封装-   而不是让事物可见,而是“安全”(通过   不变性)。引用来自   https://clojure.org/reference/datatypes,“封装是愚蠢的”。

     

gen-class不是用于生成所有可能的通用DSL   Java类。它是一种用于生成特定样式的类的工具   符合Clojure的美学。

     

然而,遵循这些思路的另一种方法是使用   deftype,可以具有私有可变字段,由   内联实现接口或协议。 deftype字段可以   具有^:volatile-mutable或^:unsynchronized-mutable的meta,   这两个都将成为私有字段。