2011-06-29 10 views
11

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

のDeftypeは私が以外をしたいすべては、引数なしのコンストラクタを提供しません。

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

使用GEN-クラス。私がそれを避けることができれば、私はこれをしたくありません。
何とかdeftypeの知識の外にあるprivateメンバー変数をエンコードしています。私はこれができないと言われてきました。
また、nullaryコンストラクタも作成する変更されたdeftypeを作成します。率直に言って、私はこれに十分なクロージャを知らない。
deftypeによって作成されたクラスを取得し、何らかの形でそれに新しいコンストラクタを追加します。

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

Genクラスを実行可能にする以外に、私が提案した解決策(または私が考えていないもの)はありますか?

+0

コンストラクタの作成は、clojureのJavaコードの深いところにあるようです。したがって、デフタイプ自体を変更することは少し難しく、ちょっとした悪い考えであるように思えます。 –

+0

フィールドはどのようにアクセスされ、インスタンスはyourClass.newInstance()とリフレクションを生成しましたか?だから、多分私はビットが恐れていることを恐れている生成されたクラスのJava側の使用法の詳細を知っているかもしれないgenクラスの時間:( –

答えて

3

あなたのJava相互運用性の要件が同時に具体的であり、揺るぎないものであれば、適切な場合は、恥ずかしがり屋のJavaを記述することは絶対にありません。 deftypeクラスのインスタンスを返す単一の静的ファクトリメソッドを使用してJavaクラスを作成し、必要な初期化/セットアップを行います。

また、Clojureにnullaryファクトリ関数を記述し、Javaから一日中呼び出すことができます。

いずれにしても、deftypedefrecordも完全な機能を備えた相互運用機能ではありません。 gen-classが確実に最も近いので、推奨されています。

2

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

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

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