— Салом, Амиго!
— Салом, Ким.
— Clone() metod haqida gapirib beraman.
Bu metodning maqsadi - obyektni klonlash, ya'ni uni nusxasini/duplikatini yaratish.
Agar uni chaqirsangiz, Java-mashina objektdan duplikat yaratadi va qaytaradi.
Object klassidagi obyektni klonlash juda sodda amalga oshiriladi — klonlashda faqat bitta yangi obyekt yaratiladi: shunchaki yana bitta obyekt yaratiladi va uning maydonlariga original obyektdagi maydonlarning qiymatlari o'rnatiladi.
Agar nusxa olinayotgan obyekt boshqa obyektlarga havolalar (ссылки) saqlasa, havolalar nusxalanadi, lekin o'sha obyektlarning duplikatlari yaratilmaydi.
— Гм. Kam-ku.
— Gap shundaki, Java-mashina qaysi obyektlarni klonlash mumkinligini, qaysilarini klonlash mumkin emasligini bilmaydi. Masalan, fayllarni klonlash mumkin emas. Shu bilan birga System.in potokini ham.
Shuning uchun to'liq klonlash masalasi klass ishlab chiquvchilariga qoldirilgan. Bu jarayon equals metodiga o'xshatib amalga oshirilgan. Hattoki hashCode ga o'xshash interfeys Cloneable ham bor.
Cloneable interfeysi - hech qanday metodni o'z ichiga olmaydigan marker interfeysi. U ba'zi klasslarni belgilash uchun ishlatiladi.
Agar klass ishlab chiquvchisi klassdagi obyektlarni klonlash mumkin deb hisoblaydigan bo'lsa, u klassni ushbu interfeys bilan belgilaydi (klassni Cloneable dan meros qilib oladi).
Agar ishlab chiquvchi standart clone metodi amalga oshirilishidan norozi bo'lsa, u o'zi to'g'ri duplikat yaratadigan amalga oshirishni yozishi kerak.
clone metodini chaqirganda, Java objektning Cloneable interfeysi borligini tekshiradi. Agar ha — klonlash clone metodi orqali amalga oshiriladi, agar yo'q — CloneNotSupportedException chiqaradi.
— Demak, biz yangi amalga oshirish yozish uchun clone metodni override qilishimiz yoki Cloneable dan meros olishimiz kerak?
— Ha, lekin metodni override qilish kerak bo'ladi. Clone() metod protekted sifatida e'lon qilingan, shuning uchun u faqat o'z paketidagi klasslar (java.lang.*) yoki klass-merosxo'rlar uchun chaqirishga ochiq.
— Biroz chalkashdim, obyektdan qanday qilib klon olish kerakligini aytsangiz?
— Mana, agar Object klassida amalga oshirilgan "default клонирование" dan foydalanishni istasangiz:
a) Klassga Cloneable interfeysini qo'shing
b) Clone metodini override qiling va unda asosiy amalga oshirilishini chaqiring:
class Point implements Cloneable
{
int x;
int y;
public Object clone()
{
return super.clone();
}
}
Yoki clone metodini to'liq o'zingiz yozishingiz mumkin:
class Point
{
int x;
int y;
public Object clone()
{
Point point = new Point();
point.x = this.x;
point.y = this.y;
return point;
}
}
— Qiziqarli metod, ba'zan foydalanaman...
GO TO FULL VERSION