9

クローンとコピーコンストラクタに関するこのArtimaの記事から:

オブジェクトのcloneメソッドは非常に注意が必要です。これはフィールドコピーに基づいており、「言語外」です。コンストラクターを呼び出さずにオブジェクトを作成します。コンストラクターによって確立された不変条件を保持するという保証はありません。Sunの内外を問わず、オブジェクトのクローンを作成するまでチェーンの上位でsuper.cloneを繰り返し呼び出すと、オブジェクトの浅いコピーが作成されるという事実に起因して、長年にわたって多くのバグが発生しています。

Joshua Blochは、言語外とはどういう意味ですか?

4

3 に答える 3

9

彼は「Javaの範囲外」のようなものを意味します。

特にJavaでは、新しいオブジェクトを作成する「正しい」方法は、そのオブジェクトのコンストラクターを使用することです。多くのクラス作成者は、この仮定に依存し、ロジックをコンストラクターにコーディングします (入力の検証など、構築時に保証する必要があるものすべて)。これを彼は「コンストラクターによって確立された不変条件」と呼んでいます。ただし、クローン作成はこの基本的な制約をバイパスし、コンストラクターを呼び出さずにメモリのコピーを作成します。したがって、「余分な言語」です。

技術的には、シリアル化も同様です。

于 2013-03-08T17:10:42.280 に答える
0

おそらく Java では実装されていませんが、Object クラスにネイティブがあるという事実です。

于 2013-03-08T17:10:54.193 に答える