2011-06-29 55 views
11

爲了與Java互操作的目的,我需要一個具有無限構造函數的類來執行初始化。 這個類的對象需要有類似可變java字段的東西(即對象代表遊戲的後端,並且需要保持遊戲狀態)。添加構造函數deftype創建的類

DEFTYPE確實一切我想做除了提供null構造(因爲我創建帶有字段的類)。

我不需要領域是公共可讀的,所以我能想到的解決方案4:

使用創一流;如果我能避免它,我不想這樣做。
以某種方式編碼deftype知識以外的私有成員變量;我被告知這是無法完成的。
編寫一個修改後的deftype,它也會創建一個空的構造函數;坦率地說,我不知道clojure是否足夠。
以deftype創建的類,並以某種方式添加一個新的構造函數。

最後,我需要一個Java類,因爲我將把它交給將從該類中創建一個新對象的Java代碼。

除了使用gen-class可行性之外,我提出的任何解決方案(或任何我沒有想到的)?

+0

看起來構造函數的創建深入clojure的java代碼中。所以修改deftype本身聽起來有點難,有點壞主意。 –

+0

如何訪問字段並生成實例yourClass.newInstance()和反射?所以也許知道更多的生成類的Java方面的用法將有所幫助,否則我有點害怕是時候爲gen-class :( –

回答

3

有中,在適當情況下,編寫Java幾許如果您的Java互操作的要求是同時具體和不可動搖的絕對沒有羞恥。您可以使用單個靜態工廠方法編寫Java類,該方法返回deftype類的實例,並且可以執行所需的任何初始化/設置。

或者,您可以在Clojure中編寫一個無效的工廠函數,並且可以通過Java直接調用該函數。

在任何情況下,既不是deftype也不是defrecord意圖是(或將他們永遠是)功能齊全的互操作設施。 gen-class肯定是最接近的,這就是爲什麼它被推薦。

2

我建議只是在Java中編寫對象 - 對於具有可變字段的類Java對象,它可能會更優雅,易於理解和實用。

我通常在項目中混合使用Java和Clojure代碼的結果相當不錯。這似乎是這種情況下可能適用的情況之一。互操作性非常好,幾乎沒有任何額外的複雜性。

順便說一句 - 我假設你需要一個null構造滿足一些持久性庫或類似的要求?這似乎是一個奇怪的要求,否則。如果是這種情況,那麼你可能會發現重新考慮你的持久性策略是有意義的......像這樣的任意限制對我來說似乎總是有點代碼味道。

相關問題