2

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

gen-class 的ClojureDocs说该state字段将是公开的

:州名

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

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

4

1 回答 1

0

@alexmiller 最近在这里回答了这个问题

简而言之,没有。正如您在文档中提到的,gen-class state 字段将是 public final 字段。但是,该字段可以是(例如)由实现方法有状态地修改的原子。一般来说,我们不太重视 Clojure 中的封装——而是更喜欢让事物可见,但“安全”(通过不变性)。引用来自 https://clojure.org/reference/datatypes的 Rich 的话,“封装是愚蠢的”。

gen-class 不是用于生成所有可能的 Java 类的通用 DSL。它是一种按照 Clojure 的美学以某种风格生成类的工具。

然而,沿着这些思路的另一条路径是使用 deftype,它可以具有私有可变字段,通过内联实现接口或协议来公开。deftype 字段可以具有 ^:volatile-mutable 或 ^:unsynchronized-mutable 的元数据,这两者都将成为私有字段。

于 2019-07-28T11:22:27.030 回答