8

Java のクローン作成に関するチュートリアルをオンラインで探していましたが、clone() の欠点しか見つかりませんでした。利点については何も見つかりませんでした。Java clone() を使用する利点をいくつか知りたいです。

4

3 に答える 3

10

クローニングには確かに用途があります。オブジェクトで表されたデータのレコードがあり、「名前を付けて保存」(複製して名前を変更) できるあらゆる種類のビジネス アプリケーションを想像してみてください。そのデータが Cloneable インターフェースを実装するオブジェクトに保持されている場合、元のデータを複製して新しい情報で更新できます。

これは、新しいオブジェクト インスタンスを作成してすべてのデータを明示的にコピーするよりも優れています。一部の人々は、コピーを行うヘルパークラスとメソッドでこれに対処しますが、クラス自体の外部にクラスをコピーするために必要な情報を持っているため、オブジェクト指向プログラミングが不十分です。

私が気に入っているもう 1 つの使用例は、クラスを GUI のバッキング ストアとして使用し、その GUI にリセット ボタンがある場合です。GUI が初期化されたら、バッキング ストア オブジェクトのクローンを作成します。次に、ユーザーが復元を押した場合、変更された可能性のある情報を把握したり、ストレージから元の情報の新しいコピーを取得したりするのではなく、クローン オブジェクトの値に合わせて GUI を再初期化します。確かに用途はたくさんあります。

しかし、ご存知のように、クローン作成は継承フレームワークで問題を引き起こし、軽量のデータ クラスを混乱させる可能性があるため、ビジネス要件がない限り、オブジェクトをクローン可能にはしません。

于 2013-05-02T02:15:16.013 に答える
3

クローン作成の利点について何かを見つけるのに苦労している理由は、利点が暗黙的であるためだと思います。元のオブジェクトの正確な複製を作成する(おそらく)簡単な方法があるためです。

しかし残念なことに、clone() と Cloneable による Java の組み込みのクローン作成メカニズムには、考慮すべき欠点が多すぎて、主にクラスの設計に与える恐ろしい影響に関連しています。Josh Bloch は、なぜ clone() や Cloneable を使用すべきでないのかについて、彼の著書「Effective Java 」でセクション全体をまとめており、インタビューで簡単に要約されています。

clone() や Cloneable を使用する代わりにコピー コンストラクターを使用することをお勧めしますが、浅いコピーと深いコピーのどちらが適切かを判断する必要があります。また、Serializable や JAXB などのシリアル化 API やさまざまなクローン作成ライブラリを使用して、ディープ クローンを作成することもできます。関連する質問、 Java: インスタンスのディープ クローン作成/コピーに推奨されるソリューションで、非常に優れた議論を見つけることができます。

于 2013-05-02T04:25:42.883 に答える