11

Javaとの相互運用性のために、初期化を実行するnullaryコンストラクターを持つクラスが必要です。このクラスのオブジェクトは、可変のJavaフィールドに似たものを持っている必要があります(つまり、オブジェクトはゲームのバックエンドを表し、ゲームの状態を維持する必要があります)。

deftypeは、nullaryコンストラクターを提供することを除いて、私がやりたいことをすべて実行します(フィールドを持つクラスを作成しているため)。

フィールドを公に読めるようにする必要はないので、次の4つの解決策を考えることができます。

gen-classを使用します。私はそれを避けることができればこれをしたくありません。
どういうわけか、deftypeの知識の外でプライベートメンバー変数をエンコードします。これはできないと言われました。
nullaryコンストラクターも作成する変更されたdeftypeを記述します。率直に言って、私はこれに十分なclojureを知りません。
deftypeによって作成されたクラスを取得し、それに新しいコンストラクターを追加します。

この最後に、Javaクラスが必要です。これは、クラスから新しいオブジェクトを作成するJavaコードにそれを渡すためです。

gen-classを使用する以外に、私が提案した(または私が考えていなかった)解決策は実行可能ですか?

4

2 に答える 2

3

Javaの相互運用要件が同時に具体的で揺るぎないものである場合は、必要に応じて、Javaのダッシュを書くことはまったく恥ずべきことではありません。deftypeクラスのインスタンスを返し、必要な初期化/セットアップを実行する単一の静的ファクトリメソッドを使用してJavaクラスを作成できます。

または、Clojureでnullaryファクトリ関数を記述し、それをJavaから一日中直接呼び出すこともできます。

いずれにせよ、完全な機能を備えた相互運用機能であるとは限らず、またそうなることも意図されて deftypeいません。確かに最も近いので、推奨されています。defrecordgen-class

于 2011-06-30T11:04:41.760 に答える
2

オブジェクトをJavaで記述することをお勧めします。可変フィールドを持つJavaのようなオブジェクトの場合、おそらくよりエレガントで、理解しやすく、実用的です。

私は一般的に、プロジェクトでJavaコードとClojureコードを混合してかなり良い結果を出しました。これは、これが適切である可能性があるケースの1つのようです。相互運用性は非常に優れているため、余分な複雑さはほとんどありません。

ところで-永続ライブラリなどの要件を満たすには、nullaryコンストラクタが必要だと思いますか?そうでなければ、それは奇妙な要件のようです。この場合、永続化戦略を再考することが理にかなっていると思うかもしれません.....このような恣意的な制限は、私には常にコードの臭いのように思えます。

于 2011-06-30T21:09:32.197 に答える