最近、ビジネスはオブジェクトをコピーする必要がありますが、1つずつ取得および設定したくないので、オブジェクトをオンラインでコピーする3つの方法を見つけました。
1つは、浅いコピーです。
1.コピーが必要なクラスはCloneableインターフェースを実装します;
2. clone()メソッドを上書きし
ます; import java.lang.Cloneable ;;
パブリッククラスOrderVOはCloneable {
private int orderID;
private int userID;
private double orderAmount;
public int getOrderID() {
return orderID;
}
public void setOrderID(int orderID) {
this.orderID = orderID;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public double getOrderAmount() {
return orderAmount;
}
public void setOrderAmount(double orderAmount) {
this.orderAmount = orderAmount;
}
@Override
public Object clone() {
OrderVO vo = null;
try {
vo = (OrderVO) this.clone();
} catch (Exception e) {
e.printStackTrace();
}
return vo;
}
}
第二に、深いコピー。
浅いコピーでは、参照タイプの場合、値タイプのメンバー変数のみが参照オブジェクトのアドレスをクローンオブジェクトにコピーします。つまり、プロトタイプオブジェクトとクローンオブジェクトのメンバー変数は同じメモリアドレスを指します。このようにして、コピーされたオブジェクトの参照値が変更され、元のオブジェクトの値も変更されますが、これはもちろん間違っています。
2つの解決策があります。1つは、変数の参照型をクローンオブジェクトに設定することです。2つ目は、シリアル化を直接実装し、オブジェクトに対してIO操作を実行し、読み取り/書き込みを行うことです。この方法の方が厄介だと想像できます。
3つ目は、オブジェクトレプリケーション用のツールクラスBeanUtilsおよびPropertyUtils
clone()メソッドを実装するのか、IO操作を実装するのかがさらに面倒で、コードが多すぎます。現時点では、Javaツールクラスを使用して1行で取得できます。
BeanUtilsとPropertyUtilsの主な違いは、BeanUtilsが型変換関数を提供することです。つまり、同じ名前属性を持つ2つのJavaBeansが異なる型であることが判明した場合、サポートされているデータ型の範囲内で変換が実行され、PropertyUtilsはこの関数をサポートしません。サポートされていないため、速度は速くなります。実際の開発では、BeanUtilsがより一般的に使用され、ミスをするリスクが低くなります。
OrderVO vo1 = new OrderVO(); // 原对象
OrderVO vo2 = new OrderVO(); // 目标对象
try {
BeanUtils.copyProperties(vo2, vo1);
} catch (Exception e) {
e.printStackTrace();
}
ループ内でオブジェクトをコピーする場合は、ループの外で新しいオブジェクトのステートメントを記述しないでください。そうでない場合、新しい値はそれぞれ参照アドレスになります。