2009-04-25 13 views
4

最近Javaに移行しましたが、変数のエイリアシングに問題があります。私はどこでも検索しましたが、同じオブジェクトを参照するだけで、あるオブジェクトのコンテンツを別のオブジェクトにコピーする適切な方法を見つけることができません。誰にも何か提案はありますか?Java変数のエイリアシングの回避策

編集:エイリアシングの問題が発生しているintの場合はどうなりますか?私はこのような状況をまず避けるべきですか?もしそうなら、どうですか?

+0

コード内に意味する行の1行または2行を投稿できますか?私は、あなたが「同じオブジェクトを参照するだけで、あるオブジェクトの内容を別のオブジェクトにコピーする」ということを100%確信しているわけではありません。 – Joe

+0

用語のエイリアスを使用する言語は何ですか?私はエイリアスと同じオブジェクトへの2つの参照を考えるでしょう。しかし、オブジェクトの深いクローンは、最初のオブジェクトを実際に参照していない完全に新しいオブジェクトを提供します。それはどうしてエイリアスですか? –

答えて

10

クラスがClonableインターフェイスを実装している場合は、Object.clone()メソッドを使用してハードコピーを作成できます。 Wikipediaのエントリにはいくつかの詳細があります。

代替方法は、this pageに従ってより安全なcopy constructorsを使用することです。

+1

mihiさんの答えと同じくらい便利ですが、私はこの記事のすべての便利なリンクが好きでした。リンクは、必要に応じてより多くの情報を見つける方法を私に提供します。とにかく、コピーコンストラクタを実装しました。 –

+2

クローンは非常に危険です。 「ビット単位」のコピーを作成します。これはほとんどあなたが望むものではありません。ある程度、訂正コードを挿入することができますが、あなたは時折静かにそれを混乱させる可能性があります。それはまた、継承でうまくいっていません。 –

1

java.lang.Cloneableはあなたが探しているものです。

4

「コンテンツ」によって異なります。たとえば、FileInputStreamをコピーして、両方が同じファイルからのロードを続けると仮定することはできません。

基本的に2つの方法があります:クラスが "Cloneable"インターフェイスをサポートしている場合、clone()を呼び出すことによってそのクラスを複製できます。そうでなければ、コピーコンストラクタを持ち、別のオブジェクトからデータをコピーします。

通常、浅いコピーになります(つまり、クラスのすべてのフィールドはコピーされますが、それらは同じオブジェクトを指しています)。

一方、多くのオブジェクトは(Stringクラスのように)不変であるように設計されているため、変更できないオブジェクトをコピーする必要はありません。

+0

FileInputStreamをサブクラス化してCloneableを実装することができますが、クローンは正常に動作すると思われます。おそらくちょっと変だけど、実際には同じFileDescriptorに2つのストリームオブジェクトを渡すだろうと思う。 –

1

変数を別名にすることができないように、Javaの参照への暗黙的な参照を持つことはできません。あなたは本当にあなたがint型の値をエイリアシングによって何を意味するかを説明する必要があります:あなたはあなたが達成しようとしているかを説明場合

おそらく、我々は「エイリアス」

編集せずにそれを行うことができます。 int値は実行時に匿名であるため、エイリアシングは意味をなさない。

2

別のオプションは、不変オブジェクトを作成するために、あなたのクラスを設計することです:
http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

それが作成されると、オブジェクトを変更することはできませんので、これは、クローニングまたはコピーコンストラクタの必要性を回避します。したがって、複数の変数は同じオブジェクトを指すことができますが、それらのどれもがオブジェクトの状態を変更することはできません。