Java でのオブジェクトのクローン作成

WBOY
リリース: 2024-08-30 16:04:50
オリジナル
751 人が閲覧しました

Java は最も広く使用されているプログラミング言語の 1 つであり、幅広い機能が備わっています。 Java のオブジェクトはタスクを完了するために使用されます。オブジェクトの作成、変更、移動、それぞれのメソッドの呼び出しなどを行います。ご存知のとおり、オブジェクトへの参照は Java に保存されます。したがって、同じオブジェクトを指す 2 つの参照がある場合、一方の変更はもう一方の同じ変更に完全に反映されます。さて、この要素が常に有利に働くとは限りません。そのため、クローン作成はそのような状況を阻止するための解決策です。言い換えれば、そのようなオブジェクトの正確なレプリカを作成することは、Java ではオブジェクト クローン作成として知られています。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

定義上、オブジェクトのクローン作成は、同様の状態の元のオブジェクトの正確なコピーを作成するプロセスです。クローンを作成する場合、すべてのプロパティは新しくクローンされたオブジェクトに引き継がれますが、これらのプロパティは必要に応じて変更または操作できます。 clone() メソッドは Object クラスで定義する必要があります。オブジェクトのクローンを作成するクラスには、java.lang.A クローン可能インターフェースの実装が必須です。 Cloneable インターフェイスの実装に失敗した場合、例外がスローされます。次に、オブジェクトの複製の構文を見てみましょう。

構文:

protected Object clone() throws CloneNotSupportedException
ログイン後にコピー

クラス Object の場合、特定のクローン作成操作は clone メソッドによって実行されます。このメソッドは、クラスの正確な複製を作成し、オブジェクトのフィールドの内容ですべてのフィールドを初期化します。 Cloneable インターフェイスが前述のオブジェクトのクラスによって実装されていない場合、「CloneNotSupportedException」がスローされます。すべてのアレイは Cloneable インターフェイスを実装していると見なされます。ここでは、Cloneable インターフェイスは Object クラスに実装されていません。したがって、オブジェクトに対して clone メソッドを呼び出すと、実行時エラーがスローされます。

Java でのオブジェクトの複製の仕組み

デモによって clone() メソッドの動作を理解しましょう。

コード:

class obj_clone implements Cloneable{
int phone_code;
String f_name;
obj_clone(int phone_code,String f_name){
this.phone_code=phone_code;
this.f_name=f_name;
}
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String args[]){
try{
obj_clone s1=new obj_clone(99,"sulaksh");
obj_clone s2=(obj_clone)s1.clone();
System.out.println(s1.phone_code+" "+s1.f_name);
System.out.println(s2.phone_code+" "+s2.f_name);
}catch(CloneNotSupportedException c){}
}
}
ログイン後にコピー

コードの説明: ご覧のとおり、クラスを初期化し、cloneable を実装しました。ここでは、オブジェクト内の clone() を使用して、実際のクラスが cloneable を実装しているかどうかがチェックされ、コピーの作成に進みます。次に、整数データ型の電話番号と文字列データ型の名という 2 つの変数が得られます。次に、クラス obj_clone のコンストラクターと .this キーワードを含む変数を作成しました。ご覧のとおり、オブジェクトには clone() メソッドと、前に説明した例外 CloneNotSupportedException が含まれています。さらに、ここで super.clone() はエラー CloneNotSupportedException をスローする可能性がありますが、これは後で検出します。

次にメインクラスがあり、その中のすべてに try-catch を使用しています。次に、クラスのオブジェクトを s1 および s2 として作成しました。最初のオブジェクトである s1 の両方のパラメータを渡し、s1 を s2 に複製する clone() メソッドを実装しました。最後に、2 つの出力 print ステートメントがあります。 try ブロックの外には、前述した例外を備えた catch ブロックがあります。この例の 8th 行では、構文部分で説明したように clone() を実装しました。上記のプログラムを実行すると、「99sulaksh 99sulaksh」として出力が表示されます。出力については、以下に添付されたスクリーンショットを参照してください。

出力:

Java でのオブジェクトのクローン作成

Java でのオブジェクトのクローン作成の種類

オブジェクトのクローン作成とは何か、そしてそれがどのように行われるかを理解したので、Java がサポートするクローン作成のタイプを理解しましょう。

  • 浅いクローン作成: デフォルトのクローン作成方法が実装されると常に、浅いクローン作成が行われます。 Shallow Cloning は、オブジェクトのすべてのフィールドを新しいインスタンスにコピーするだけです。浅いクローン作成は clone() によってサポートされています。
  • ディープ クローニング: 現在、デフォルトのクローン作成方法を実装していない場合は常に、ディープ クローニングを実行しています。ディープ クローン作成はニーズに応じて機能します。ここでの主な違いは、ディープ クローニングではオブジェクトの値とともにすべてのフィールドがコピーされるのに対し、シャロー クローニングではフィールドのみがコピーされることです。
  • 遅延クローン作成: Java でサポートされている 3 番目のタイプのクローン作成があります。これは、上記の 2 種類のクローン作成を組み合わせたものです。これは遅延クローニングとして知られています。また、どのクローン作成タイプをいつ使用するかについての特別なルールはありません。私たちのニーズに応じて決定するのは私たちです。

オブジェクトのクローン作成の長所と短所

ここで、オブジェクトの複製の長所と短所を理解しましょう。

メリット

すべてまたはすべてのメソッドには独自の制限と機能があることを理解した上で、クローン作成の利点を以下に示します。

  • クローン作成は時間を節約できる方法なので、時間と労力を節約できます。同じ長いコードを記述する必要はありません。
  • すでに開発されたプロジェクトに実装する場合、クローン作成はオブジェクトをコピーする最も効率的な方法です。
  • Clone() を使用して配列をコピーする最速の方法があります。

デメリット

前に述べたように、どのメソッドにも制限と機能があります。ここで、Clone() の欠点を理解しましょう。

  • JVM が clone() を使用することを理解するには、この cloneable インターフェースにはメソッドがありませんが、Cloneable インターフェースを実装する必要があります。
  • ディープ クローン作成の場合は、基本的にシャロー クローン作成をサポートしているため、object.clone() をオーバーライドする必要があります。
  • clone() はコンストラクターを呼び出さないため、オブジェクトの構築を制御することはできません。
  • 基本的に、object.clone() を実装するには、Cloneable インターフェイスの実装から始めて、clone() メソッドの定義から CloneNotSupportedException の処理など、コードにかなりの変更を加える必要があります。

clone() やその他のメソッドの長所と短所を適切に理解すれば、このような素晴らしいメソッドや関数の実装はプログラマにとって大きなメリットとなります。

結論

clone() とは何か、その機能と用途を理解しました。ディープ クローン作成とシャロー クローン作成の違い、および遅延クローン作成。浅いクローニングはフィールドのみをコピーしますが、ディープ クローニングはフィールドと値をコピーするため、必要に応じて実装できます。一方、Lazy Copy はこれら両方を組み合わせたものです。クローンのメリットとデメリットも分かりました()。

以上がJava でのオブジェクトのクローン作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!