2013-03-08 6 views
9

ジョシュア・ブロッホは余分な言語の意味は何ですか?この<a href="http://www.artima.com/intv/bloch13.html">Artima article on <em>clone vs copy constructor</em></a>から

オブジェクトのcloneメソッドは非常にトリッキーです。フィールドコピーに基づいており、 は「超言語」です。 コンストラクタを呼び出さずにオブジェクトを作成します。コンストラクタによって確立された不変量を保持する保証はありません。 年には、 を オブジェクトをクローンするまでsuper.cloneを繰り返し呼び出すだけで、オブジェクトの浅いコピーが作成されるという事実から、多くのバグがSunの内外で発生しています。

ジョシュア・ブロッホとは何ですか?特別言語とは何ですか?

+1

のクローニングIオブジェクトのインスタンス化のためにJava言語で通常確立されている規則の外にあることを意味すると思いますオブジェクトのコンストラクタを呼び出します。 – jrajav

+0

@Geek +1、あなたは、Joushua Bloch著、「効果的なJava by Joushua Bloch」の興味深い質問をたくさんお願いします。:) – PermGenError

+0

@PermGenError私は他の人にも役立つだろうと尋ねた質問を期待しています。 Stackoverflowはちょうど素晴らしいです。 – Geek

答えて

9

彼は「Javaの範囲外」という意味です。

特にJavaでは、新しいオブジェクトを作成する "正しい"方法は、そのObjectのコンストラクタを使用することです。多くのクラスの作家は、この前提に頼って、ロジックをコンストラクタに頼ります。つまり、入力検証や、工事時に保証したいことがあります。これは、「コンストラクタによって確立された不変量」です。しかし、クローニングはこの基本的な制約を迂回し、コンストラクタを呼び出さずにメモリコピーを作成します。したがって、それは「余分な言語」です。

技術的には、シリアライズもそうです。

+0

Object cloneの有効な使用例は何ですか? – Pacerier

+0

@Pacerier - コードクローニングを完全に制御できるあなた自身のプロジェクトでは、コピーコンストラクタを好む人もいますが、100%有効です。すべてのコードを管理しなくても、ライブラリ作成者のように他の開発者が作ったさまざまな前提に陥る可能性がある場合にのみ問題になります。 – radai

0

おそらく、Javaでは実装されていませんが、Objectクラスにはネイティブがあります。 (コンストラクタを呼び出すか、チェーン以外の意味)

+0

これは彼が文脈を与えたことを意味するものとは考えにくいです。 – jrajav

0

外言語オブジェクト作成メカニズムは、次のとおり

  1. シリアライゼーション
  2. 反射
  3. btyeコード生成