การโคลนเป็นกระบวนทัศน์การเขียนโปรแกรมขั้นพื้นฐาน ความจริงที่ว่า Java อาจใช้งานได้ไม่ดีในหลาย ๆ ด้านไม่ได้ช่วยลดความจำเป็นในการโคลนลงเลย และมันเป็นเรื่องง่ายที่จะใช้การโคลนนิ่งที่จะทำงานตามที่คุณต้องการให้ทำงานตื้นลึกและหลากหลายอะไรก็ได้ คุณยังสามารถใช้ชื่อโคลนสำหรับฟังก์ชั่นและไม่ใช้ Cloneable ได้หากต้องการ
สมมติว่าฉันมีคลาส A, B และ C โดยที่ B และ C มาจาก A ถ้าฉันมีรายการวัตถุประเภท A ดังนี้:
ArrayList<A> list1;
ตอนนี้รายการดังกล่าวอาจมีวัตถุประเภท A, B หรือ C คุณไม่รู้ว่าวัตถุประเภทใด ดังนั้นคุณไม่สามารถคัดลอกรายการได้ดังนี้:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(new A(a));
}
หากวัตถุเป็นประเภท B หรือ C จริงคุณจะไม่ได้รับสำเนาที่ถูกต้อง แล้วถ้า A เป็นนามธรรมล่ะ? ตอนนี้มีบางคนแนะนำสิ่งนี้:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
if(a instanceof A) {
list2.add(new A(a));
} else if(a instanceof B) {
list2.add(new B(a));
} else if(a instanceof C) {
list2.add(new C(a));
}
}
นี่เป็นความคิดที่แย่มาก จะเกิดอะไรขึ้นถ้าคุณเพิ่มประเภทที่ได้รับใหม่? จะเกิดอะไรขึ้นถ้า B หรือ C อยู่ในแพ็คเกจอื่นและคุณไม่สามารถเข้าถึงได้ในคลาสนี้
สิ่งที่คุณต้องการทำคือ:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(a.clone());
}
ผู้คนจำนวนมากระบุว่าเหตุใดการใช้งาน Java พื้นฐานของการโคลนจึงมีปัญหา แต่มันเอาชนะได้อย่างง่ายดายด้วยวิธีนี้:
ในคลาส A:
public A clone() {
return new A(this);
}
ในคลาส B:
@Override
public B clone() {
return new B(this);
}
ในคลาส C:
@Override
public C clone() {
return new C(this):
}
ฉันไม่ได้ใช้ Cloneable เพียงแค่ใช้ชื่อฟังก์ชันเดียวกัน ถ้าไม่ชอบก็ตั้งชื่ออย่างอื่น