2011-05-14 12 views
1

Cloneableインタフェースを実装していないオブジェクトをクローンする必要があります。Cloneableを実装していないオブジェクトのクローンを作成する方法

実際に私のプロジェクトではJCChartを使用しています。私のクラスはMultiChartを拡張していますので、クラスの深いコピーをcraeteする必要があります。私はクラスオブジェクトを複製することができますが、MultiChartのオブジェクトを複製する方法はあります。私もオブジェクトの伝説、オブジェクトのフッター、オブジェクトのヘッダーをクローンする必要があります。

+0

あなたがしようとしていることに対して[XStream](http://xstream.codehaus.org/)を使用できるかどうかを確認してください。 –

+0

しかし、私はアプレットでこれをやっているので、ファイルシステムにアクセスするアプレットの制限のためにオブジェクトをシリアル化することはできません –

+0

あなたのオブジェクトをCloneableインターフェイスを実装し、独自のディープコピーを実装します。 – Heisenbug

答えて

4

クラスがSerializableより大きい場合は、serialize the object to ByteStreamDeserialize that stream to a new objectとなります。

+0

私はこれを試してみたが、例外に にjava.io.IOExceptionを与える:私はそれが意志よりのwriteObjectは、あなたのObjectMap内のクラスのいずれかがserialzableでない場合は、データ –

+0

user571616 @を書き込むことができないと思う を映像コンテンツのロードに失敗しましたjava.io.NotSerializableException例外をスローします。クラスAがクラスBのオブジェクトを含んでいて、クラスAがSerializableを実装していて、クラスBのオブジェクトを直列化しているときにこの例外がスローされる場合 - classBが直列化可能ではないと言っている) –

0

もう1つの選択肢は、コピーコンストラクタを提供することです。正直なところ、私はこのオプションを好む傾向があるJavaのクローン実装の異言語的性質を考えています。

コピーコンストラクタは、単一のパラメータとして同じ型の別のインスタンスを受け取るコンストラクタで構成されます。その後、フィールドごとに対応するコピーを行います。

このようなことをするときは、問題を避けるために不変性を考慮する必要があります。

オブジェクトをシリアル化してデシリアライズする方法もありますが、これは、必ずしもオプションではないSerializableを実装する必要があることを意味し、特定の意味がありません。

+0

複雑なインスタンスグラフ。シリアライゼーションは非常に簡単です。シリアライズ可能なインターフェイスは、デフォルトのシリアル化にのみ必要です。他にも利用可能なものがあります。 –

+0

コンパイル時にクラスの型が不明な場合、コピーコンストラクタは機能しません。つまり、コピーコンストラクタを使用してオブジェクトを動的に複製することはできません。 –

2

あなたは書きました:

を私はこれを行う方法をCloneableインタフェースを実装していないオブジェクトのクローンを作成する必要があります。

仕事へのクローンのための要件は、クラスは、あなたがそれを呼びたい文脈で見えるあるclone()方法を提供することです。そのクラスはhave toを実装していません。Cloneableです。 clone()メソッドを実装して、明示的にnewを使用し、コンストラクターとセッター呼び出しによって新しいオブジェクトを初期化することができます。 (Cloneableインタフェースはjava.lang.Object.clone()方法によって実装デフォルト浅いクローニング機構を可能にする「フラグ」のインタフェースである)クローニングのトピックに関する


クローンを使用することなく、代替案は次のとおり

  • 使用します
  • 通常のコンストラクタと一連のゲッターとセッター呼び出しを使用するか、またはオブジェクトをシリアライズおよびデシリアライズすることによって
  • を呼び出します。

これらのアプローチにはすべて制限があります。例えば適切なコンストラクタ、ゲッター、セッター、または直列化可能性の可用性。最初の2つのアプローチを使用して深いクローンを実装すると、非常にコーディングが集中する可能性があります。最後のアプローチは大幅に高価になる傾向がありますが、複雑なデータ構造の深いコピーを提供するのが一番簡単な方法です。

...私はアプレットでこれをやっているので、ファイルシステムにアクセスするためのアプレットの制限のためにオブジェクトをシリアル化できません。

ObjectOutputStreamObjectInputStreamを使用して)Javaオブジェクトのシリアル化とXStream両方において、メモリバッファが付いていストリームにオブジェクトを書き込むことができます。例えばByteArrayOutputStream。これにより、ファイルシステムにアクセスする必要がなくなり、高速になります。

+0

私はシリアル化にByteArrayOutputStreamを使用し、その時に次のjava.io.IOExceptionが返されます:画像の内容の読み込みに失敗しました シリアル化時に画像が読み込まれていないと思います –

関連する問題