فصل 24: کلاس Object و کپی کردن (Cloning) اشیا در جاوا

03 شهریور 1397
object-class-and-cloning-java

کلاس Object، برای تمامی کلاس های جاوا، کلاس پدر حساب می شود. به بیان دیگر، تمامی کلاس های دیگر از آن ارث بری میکنند.

یکی از کاربردهای کلاس Object موقعی است که می خواهید به یک کلاس اشاره کنید اما نوع آنرا نمی دانید. با استفاده از Upcasting می توانید به کلاس Object اشاره کنید. می توانید از متد getObject استفاده کنید و شی‌ای که بازگردانده می شود را در یک شی از نوع Object قرار دهید. نگاه کنید:

Object obj=getObject();//we don't know what object will be returned from this method  

کلاس Object دارای متدهایی می باشد که باعث ایجاد رفتارهایی یکسان در اشیا شده است.

از متدهای کلاس Object می توان به موارد زیر اشاره کرد:

متد توضیح
public final Class getClass() کلاسی که شی از آن ساخته شده است را برمی گرداند. از این کلاس می توان برای پیدا کردن متادیتا استفاده کرد
public int hashCode() عدد کد هش را برای این شی برمی گرداند.
public boolean equals(Object obj) دو شی را با هم مقایسه می کند
protected Object clone() throws CloneNotSupportedException کپی دقیق شی را می سازد و بر می گرداند
public String toString() رشته معرف شی را بر می گرداند
public final void notify() ریسه‌ای که منتظر اعلان میباشد را بیدار میکند.
public final void notifyAll() تمام ریسه‌هایی که منتظر اعلان می باشند را بیدار می کند
public final void wait(long timeout)throws InterruptedException باعث می شود که ریسه کنونی مدت زمانی به میلی ثانیه صبر کند تا پیغام اعلان را از ریسه های دیگر دریافت کند.
public final void wait(long timeout,int nanos)throws InterruptedException باعث می شود که ریسه به اندازه میلی ثانیه و نانو ثانیه داده شده صبر کند تا پیغام اعلان را از ریسه های دیگر دریافت کند
public final void wait()throws InterruptedException ریسه کنونی تا پیغام اعلان را از ریسه های دیگر دریافت کند، صبر می کند.
protected void finalize()throws Throwable قبل از اینکه شی در جمع کننده زباله قرار گیرد آنرا صدا می کند.

 

کپی کردن (Clone) اشیا در جاوا

کلون کردن اشیا یا Object cloning روشی است که با استفاده از آن می توان یک کپی دقیق از یک شی بدست آورد. اینترفیس java.lang.Cloneable  باید توسط کلاسی که می خواهیم شی‌ای از آن را کلون کنیم پیاده سازی شود. در غیر این صورت با CloneNotSupportedException روبه رو می شویم.

سینتکس:

protected Object clone() throws CloneNotSupportedException

چرا از متد clone() استفاده کنیم؟

استفاده از این روش در مقایسه با ساخت یک شی کاملا کپی توسط کلیدواژه new، بسیار راحت تر می باشد و زمان بسیار کمتری برای اینکار صرف می شود.

مزایای کپی کردن (Cloning) اشیا

با اینکه متد clone() دارای ایراداتی در طراحی می باشد، با اینحال روشی آسان و پرطرفدار برای ساخت شی کپی می باشد. از مزایای آن می توان به موارد زیر اشاره کرد:

  • برای اینکه کار مشابه این متد را انجام دهید، نیاز به نوشتن کد طولانی و تکراری دارید، در حالی که با clone() اینکار بسیار راحت تر انجام می شود.
  • راحت‌ترین و بهینه ترین راه برای کپی کردن اشیا مخصوصا در پروژه‌های قدیمی میباشد. تنها نیاز دارید اینترفیس cloneable را پیاده سازی کنید و از این متد استفاده کنید.
  • سریع ترین راه برای کپی کردن اشیا می باشد.

ایرادات کپی کردن (Cloning)

کلون کردن اشیا با وجود مزایایی که دارد، ایراداتی نیز دارد که می توان به موارد زیر اشاره کرد:

  • برای استفاده از این متد، کارهای نسبتا زیادی باید انجام شود، برای مثال لازم است که اینترفیس مذکور پیاده سازی شود، متد clone() تعریف شود و CloneNotSupportedException نیز هندل شود.
  • پیاده سازی اینترفیس cloneable به دلیل نداشتن متد در آن و اعلام این نکته به ماشین مجازی که می خواهیم از متد clone استفاده کنیم وقت‌گیر است.
  • clone() از نوع protected می باشد به همین دلیل باید clone() خود را ایجاد کنیم و غیر مستقیم Object.clone() را صدا بزنیم.
  • clone() هیچ کانستراکتوری یا سازنده ای را صدا نمی زند به همین دلیل کنترلی در ساخت شی نداریم.
  • در صورتی که بخواهیم متد clone را در یک کلاس فرزند بنویسیم، آنگاه باید در تمام کلاس های پدر این متد را تعریف کنیم یا آنها از کلاس پدر خود ارث بری کنند. در غیر این صورت زنجیره clone() به هم میریزد.
  • clone() اصطلاحا کپی سطحی می کند و در صورت نیاز به کپی عمیق، باید اورراید شود.

حال یک مثال استفاده از کلون اشیا ببینیم:

مثال:

class Student18 implements Cloneable{  
int rollno;  
String name;  
  
Student18(int rollno,String name){  
this.rollno=rollno;  
this.name=name;  
}  
  
public Object clone()throws CloneNotSupportedException{  
return super.clone();  
}  
  
public static void main(String args[]){  
try{  
Student18 s1=new Student18(101,"amit");  
  
Student18 s2=(Student18)s1.clone();  
  
System.out.println(s1.rollno+" "+s1.name);  
System.out.println(s2.rollno+" "+s2.name);  
  
}catch(CloneNotSupportedException c){}  
  
}  
}

خروجی:

Output:101 amit
       101 amit

همانطور که در کلاس بالا دیدید، به راحتی از شی s1 در s2 کپی کردیم. در صورتی که این کار را دستی و با کمک کلمه کلیدی new انجام میدادیم، زمان قابل توجهی از ما مصرف میشد.

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.