11

出于与 Java 的互操作性的目的,我需要一个具有执行初始化的空构造函数的类。这个类的对象需要有类似于可变java字段的东西(即对象代表游戏的后端,需要保持游戏状态)。

deftype 做我想做的所有事情,除了提供一个空构造函数(因为我正在创建一个带有字段的类)。

我不需要这些字段是公开可读的,所以我可以想到 4 个解决方案:

使用 gen 类;如果可以避免,我不想这样做。
以某种方式在 deftype 知识之外对私有成员变量进行编码;我被告知这是不可能的。
编写一个修改过的 deftype,它也创建一个空构造函数;坦率地说,我不太了解clojure。
获取由 deftype 创建的类并以某种方式向其添加新的构造函数。

最后,我需要一个 Java 类,因为我将把它交给 Java 代码,Java 代码将从该类中创建一个新对象。

除了使用 gen-class 之外,我建议的任何解决方案(或我没有想到的任何解决方案)是否可行?

4

2 回答 2

3

如果您的 Java 互操作要求同时是具体的和不可动摇的,那么在适当的情况下编写一些 Java 绝对不会感到羞耻。您可以编写一个带有单个静态工厂方法的 Java 类,该方法返回deftype该类的一个实例,并执行您需要的任何初始化/设置。

或者,您可以在 Clojure 中编写一个空工厂函数,并整天从 Java 中直接调用它。

在任何情况下,既不deftype也不defrecord打算成为(或将永远成为)功能齐全的互操作设施。 gen-class当然是最接近的,这就是为什么它被推荐。

于 2011-06-30T11:04:41.760 回答
2

我建议只用 Java 编写对象——对于具有可变字段的类 Java 对象,它可能会更优雅、更易于理解和更实用。

在项目中混合 Java 和 Clojure 代码时,我通常会获得很好的结果。这似乎是合适的情况之一。互操作性非常好,几乎没有任何额外的复杂性。

顺便说一句-我假设您需要一个空构造函数来满足某些持久性库或类似内容的要求?否则,这似乎是一个奇怪的要求。如果是这种情况,那么您可能会发现重新考虑您的持久性策略是有意义的......像这样的任意限制对我来说似乎总是有点代码味道。

于 2011-06-30T21:09:32.197 回答