为了与Java的互操作性,我需要一个具有执行初始化的nullary构造函数的类。 这个类的对象需要有类似可变java字段的东西(即,对象代表游戏的后端,并且需要保持游戏状态)。
deftype会我要做的所有 除了提供一个无效的构造函数(因为我正在创建一个带字段的类)。
我不需要这些字段是公开可读的,所以我可以想到4个解决方案:
使用gen-class;如果我能避免,我不想这样做 以某种方式编码私有成员变量以外的deftype知识;我被告知无法做到这一点 编写一个修改过的deftype,它也创建了一个nullary构造函数;坦率地说,我不太了解这种情况 以deftype创建的类,并以某种方式向其添加新的构造函数。
最后,我需要一个Java类,因为我将把它交给Java代码,它将从类中创建一个新对象。
除了使用gen-class之外,我建议的任何解决方案(或任何我没有想过的解决方案)是否可行?
答案 0 :(得分:3)
如果您的Java互操作要求同时具体且不可动摇,那么在适当的情况下编写一些Java绝对没有任何羞耻感。您可以编写一个带有单个静态工厂方法的Java类,该方法返回deftype
类的实例,并执行您需要的任何初始化/设置。
或者,你可以在Clojure中编写一个nullary工厂函数,并且整天直接从Java调用它。
在任何情况下,deftype
和defrecord
都不是(或将会是)全功能的互操作设施。 gen-class
肯定是最接近的,这就是推荐它的原因。
答案 1 :(得分:2)
我建议用Java编写对象 - 对于具有可变字段的类Java对象,它可能更优雅,可理解和实用。
我在项目中混合使用Java和Clojure代码一般都有相当不错的结果。这似乎是可能适合的情况之一。互操作性非常好,几乎没有任何额外的复杂性。
BTW - 我假设您需要一个无效的构造函数来满足某些持久性库或类似的需求?这似乎是一个奇怪的要求。如果是这种情况,那么您可能会发现重新考虑您的持久性策略是有意义的......像这样的任意限制对我来说似乎总是有点代码味道。