コピーコンストラクターを使用していましたが、スタックオーバーフローなどのリンクも使用しました。しかし、私は次の点について明確ではありません。
Copy Constructorを使用するのに必要な正確な状況またはシナリオは何ですか。誰かが例を使って説明したり、リンクを指摘して、明確に理解して理解できるようにすることができます。
以下は、コピーコンストラクターとは何かを理解するために行ったリンクです。
http://www.programmerinterview.com/index.php/Java-questions/how-copy-constructors-work/
https://deepeshdarshan.wordpress.com/2013/12/05/copy-constructors-in-Java/
2番目のリンクは、コピーコンストラクターを使用する「理由」と「場所」を説明しています。しかし、それでもまだ明確ではありません。
以下は私のクラスEmployee.Javaです
package com.test;
/**
* @author avinashd
*
*/
public class Employee {
private String rollNo;
private String name;
//constructor
public Employee(String rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
//copy constructor
public Employee(Employee employee){
this.rollNo = employee.rollNo;
this.name = employee.name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Copy Constructorは、既存のオブジェクトと同じ値を持つオブジェクトの正確なコピーを作成するために使用されます。
たとえば、値がrollNo: 1
およびname: avinash
のEmployeeがあるとします。コピーコンストラクターは、rollNo: 1
およびname: avinash
の値を持つ同様のオブジェクトを作成します。ただし、どちらも2つの異なるオブジェクトであり、onオブジェクトの値を変更しても、別のオブジェクトには影響しません。
ここの質問は
次のようなコンストラクタがある場合
public Employee(String rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
オブジェクトを作成します。同じコンストラクターを呼び出して、別のオブジェクトを作成できます。しかし、なぜコピーコンストラクターを呼び出す必要がありますか?説明してください
すべてのパラメーターを渡すコンストラクターの代わりにコピーコンストラクターを使用する2つの理由があります。
コピーコンストラクターは、慣例により、オブジェクトのディープコピーを提供する必要があります。他の回答ですでに述べたように、コピーコンストラクターが提供する主な利便性は、オブジェクトが複雑になりすぎることです。 Java.lang.Cloneable
は(ほぼ)同様の宣言を提供することに注意してください。
ただし、Cloneable
インターフェイスよりもコピーコンストラクタを使用することには多くの利点があります。
インターフェースとしてのCloneable
は、実際にはメソッドを提供しません。有効にするためには、Java.lang.Object
のclone
メソッドをオーバーライドする必要があります。これは、インターフェイスの直感に反する使用法です。
clone
はObject
を返します。使用するためには、型キャストする必要があります。これは厄介で、実行時エラーにつながる可能性があります。
clone
メソッドの文書化は不十分です。 clone
の場合、変更可能なオブジェクトを指す最終フィールドがあると物事が台無しになる可能性があります。
最も重要なのは、コピーコンストラクターがサブクラスのインスタンスを取り込み、ディープコピーできることです。 IMO、これはコピーコンストラクタが本当に輝くところです。
より多くの利点があります(Joshua BlochのEffective Java 2eを参照)が、これらは私がこれまで取り組んできたことに最も関連している点です。
[1] Java言語には何も実際にディープコピーのデフォルト構造を提供しません。オブジェクトは、Cloneable
を実装することで、ディープコピーできることをプログラマに伝えることができます。またはコピーコンストラクターを提供します。
既に持っているものとまったく同じ値を持つ別のEmployee
インスタンスが必要な場合はどうなりますか?.
電話しますか?
setName(oldEmployee.getName())..
setRollNumber(oldEmployee.getRollNumber())..
etc..
それをする代わりに、これを使用してください
Employee copyOfEmployeeOne=new Employee(employeeOneInstance);
// no need of a sequence of setters..
別のケースは、オブジェクトの「履歴」値を保存することです。
したがって、単一のオブジェクトがありますが、その状態を変更するたびに、ArrayList
または任意のデータ構造に追加する必要があります。
コピーコンストラクターは、Object.clone()メソッドよりも多くの利点があります。
コピーコンストラクターを使用して、Cloneableインターフェイスの実装やcloneメソッドの上書きなど、非常に複雑なものを使用せずにクローンを作成できます。また、ディープクローニングについて特別に心配する必要はありません。
ただし、注意すべき点は次のとおりです。
1. Cloneableを実装すると、このクラスのオブジェクトが複製可能になるのは、他のクラス/ユーザーへの刺激です。これがないと、他のクラスにはクローン可能に関する明示的な情報がない場合があります。
2.コピーコンストラクタをprivateにすると、このクラスのオブジェクトの複製を制限できます。次に、このコピーコンストラクターは、他のクラスでクローンを作成するためではなく、クラスのローカルで新しく作成されたオブジェクトを初期化するためにのみ使用できます。
3.クラスをクローン可能にしたくないが、アクセス指定子をパブリックにしてコピーコンストラクタを記述した場合、他のクラスがクラスのオブジェクトを作成できるという不安につながります。
コピーコンストラクターは、浅いクローンメカニズムと深いクローンメカニズムの両方を実装しますが、クローンコンストラクターを使用して(Cloneableインターフェイスを使用して)コピーコンストラクターを使用する主な利点は次のとおりです。