Javaのclone機構(およびStringの特殊性)

2415 ワード

1.lone&Copy
現在Employeeオブジェクトがあると仮定して、Employee tobry=new Employee(CMTobry、5000)は、通常、我々はこのような割り当てがあります。Employee cindyelf=tobbryは、この時点では単にcopyしただけです。例えば、cindyelf.raseSalary()の方法でsalaryドメインの値を変えたら、tobryはget Salary()の方法で得られたのは修正されたsalaryドメインの値で、明らかにこれは私達が見たいのではないです。私たちはtobbryの正確なコピーを望んでいます。同時に両方とも影響がないので、ここで私たちはCloneを使って需要を満たすことができます。Employee cindy=tobry.clone()は、新しいEmployeeオブジェクトを生成し、tobryと同じ属性値と方法を持っています。
 
2.Shallow Clone&Deep Clone
Cloneはどうやって完成しましたか?Objectは、ある対象に対してClooneを実施する時には、ドメイン対ドメインのcopyを簡単に実行するだけで、これがShallow Clooneです。このように、問題が来ました。Employeeを例にとって、hireDayは基本パターンの変数ではなく、reference変数です。Cloneを通過すると、新しいDateパターン別のreferenceが発生します。元のオブジェクトと対応するドメインが同じDateオブジェクトを指すので、クローン類は元のクラスと一部の情報を共有します。これは明らかに不利です。プロセスは下記の図に示されています。
この時はdeep Cloneを行う必要があります。例えば、本例のhireDayのような、非基本型の領域に対して特別な処理を行います。Clone方法を再定義し、hireDayに対して特別な処理を行うことができます。下記のコードの通りです。
class Employee implements Cloneable 

{ 
public Object clone() throws CloneNotSupportedException 
{ 
Employee cloned = (Employee) super.clone(); 
cloned.hireDay = (Date) hireDay.clone() 
return cloned; 
} 
}   
3.Clone()方法の保護機構
 
Objectの中でClone()はprotectedとして申明されています。このようにするのは一定の道理があります。Employeeで。
例えば、プロテックスとして申明することによって、Employee類の中にしか「クローン」Employeeオブジェクトがないことが保証されます。原理は前のpublic、protected、prvateに関する学習ノートを参照することができます。
 
4.Clone()メソッドの使用
 
Clone()の使い方は簡単です。以下の点に注意してください。
a.show Cloneはいつ使われますか?deep Clonはいつ使われますか?これは主に具体的な対象のドメインの性質を見ます。基本型はやはりreference variableです。
b.Clone()メソッドを呼び出す対象のクラスはimplements Clobaleインターフェースでなければなりません。そうでないと、Cloneメソッドを呼び出す時にClone Not Supported Exceptionを投げます。
 
5.String
Stringの特殊性は: 
   彼は引用型であり、彼が指さした値が定数であるため、クローンされたオブジェクトは彼の値を変えます。実際には、クローンオブジェクトのStringタイプのメンバーの指向を変更し、クローンオブジェクトの値とその指向に影響を与えない。
 
1、基本データタイプは、自動的に深さcloneを実現することができます。
2、Stringは例外です。   でも、プログラミングにとっては基本的なデータのタイプと同じようにできます。ほとんど影響がありません。私たちのプログラミングはとても便利です。
   Stringタイプの変数cloneの後の表現も深さcloneを実現したようですが、実はただの仮想です。   cloned.name=「new」を実行するからです。文の場合、新しいstringタイプを生成し、またcloned.nameに返送するのに相当します。   これはstringがsun社のエンジニアによって书かれた変更できないクラスであり、すべてのstringクラスの関数で自分の値を変更することができないからです。
=>これは、クローンをより簡単に実現するための方法をサポートすることを教えてくれます。自分で定義したクラスを変更できないように作成します。
3、SteringBufferは特殊な処理が必要です。   StringとString Bufferは違います。   このようなテクニックを参考にして、StringBuffer型の変数に対してクローン効果を実現できます。sb=new StrigBuffer(sb.toStering();