オブジェクトのcloneメソッドは非常にトリッキーです。フィールドコピーに基づいており、 は「超言語」です。 コンストラクタを呼び出さずにオブジェクトを作成します。コンストラクタによって確立された不変量を保持する保証はありません。 年には、 を オブジェクトをクローンするまでsuper.cloneを繰り返し呼び出すだけで、オブジェクトの浅いコピーが作成されるという事実から、多くのバグがSunの内外で発生しています。
ジョシュア・ブロッホとは何ですか?特別言語とは何ですか?
オブジェクトのcloneメソッドは非常にトリッキーです。フィールドコピーに基づいており、 は「超言語」です。 コンストラクタを呼び出さずにオブジェクトを作成します。コンストラクタによって確立された不変量を保持する保証はありません。 年には、 を オブジェクトをクローンするまでsuper.cloneを繰り返し呼び出すだけで、オブジェクトの浅いコピーが作成されるという事実から、多くのバグがSunの内外で発生しています。
ジョシュア・ブロッホとは何ですか?特別言語とは何ですか?
彼は「Javaの範囲外」という意味です。
特にJavaでは、新しいオブジェクトを作成する "正しい"方法は、そのObjectのコンストラクタを使用することです。多くのクラスの作家は、この前提に頼って、ロジックをコンストラクタに頼ります。つまり、入力検証や、工事時に保証したいことがあります。これは、「コンストラクタによって確立された不変量」です。しかし、クローニングはこの基本的な制約を迂回し、コンストラクタを呼び出さずにメモリコピーを作成します。したがって、それは「余分な言語」です。
技術的には、シリアライズもそうです。
おそらく、Javaでは実装されていませんが、Objectクラスにはネイティブがあります。 (コンストラクタを呼び出すか、チェーン以外の意味)
これは彼が文脈を与えたことを意味するものとは考えにくいです。 – jrajav
外言語オブジェクト作成メカニズムは、次のとおり
のクローニングIオブジェクトのインスタンス化のためにJava言語で通常確立されている規則の外にあることを意味すると思いますオブジェクトのコンストラクタを呼び出します。 – jrajav
@Geek +1、あなたは、Joushua Bloch著、「効果的なJava by Joushua Bloch」の興味深い質問をたくさんお願いします。:) – PermGenError
@PermGenError私は他の人にも役立つだろうと尋ねた質問を期待しています。 Stackoverflowはちょうど素晴らしいです。 – Geek