View Full Version : null قرار دادن یکی از کانستراکتور های تک پارامتری
mostafa3dmax
چهارشنبه 27 دی 1396, 10:04 صبح
سلام
من یه کلاس student دارم و یه کلاسی که یکی از خاصیتاش کلاس student هست .
class Myclass(){
private Student st;
public Myclass(Student st){
this.st=st;
}
public Myclass(Myclass clazz){
this.st=clazz.st;
کانستراکتور دومی برای اینکه که بتونم یه کپی از کلاس اصلی درست کنم . حالا میخام از Myclass یه کلاس جدیدnew کنم و توی کانستراکتوری که student میگیره مقدار null بدم ولی ارور میده میگه دوتا کانسترراکتور تک پاترامتری وجود داره یه همچین چیزی ، حالا چطور میتونم مشخص کنم که این مقدار برای کدوم کانسراکتور داده شده ؟ ینی چطور مشخص کنم که میخام برای کانستراکتوری که student میگیره مقدار null داده بشه ؟
vahid-p
چهارشنبه 27 دی 1396, 10:57 صبح
نمیتونید تعیین کنید و قطعا خطا میده. چون null مشخص نیست مربوط به چه نوع آبجکتی هست. نباید null بدید یا یه تفاوتی داشته باشن این دو کانستراکتور. شما فرض کنید من میگم MyClass(null) میتونید بگید منظورم کدومه؟ نه، پس jvm هم نمیتونه تعیین کنه.
معمولا برای چنین حالاتی مثلا یه حالات خاص ایجاد میکنند مثلا Student.NONE یا MyClass.NONE که در اصل آبجکت هستن ولی آبجکت خاصی هستند که راحت میتونن چک کنن. ولی بهترین راه تفاوت قائل شدن بین این دو کانستراکتور هست.
اما برای کپی کردن از کلاس فعلی معمولا از کانستراکتور استفاده نمیکنن. می تونید متد clone رو override کنید. فقط حواستون باشه به این صورت که نوشتید باعث میشه دو تا آبجکت MyClass داشته باشید که هر دو st اشون یکی باشه و اگر محتوای یکی رو تغییر بدی اون یکی هم تغییر میکنه. اگر میخواید کامل متفاوت ولی با مقادیر یکسان باشند، باید در داخل متد clone کلاس MyClass از متد clone آبجکت st استفاده کنید که باز باید متد clone کلاس Student رو پیاده سازی کنید و اینکار به صورت سلسله مراتبی ادامه پیدا کنه تا جایی که به مقادیر primitive مثل int, double ... برسه یا به متغیرهای immutable مانند String.
اگر چنین چیزی میخواستید لازمه این مفاهیمی رو که گفتم رو بدونید
mostafa3dmax
چهارشنبه 27 دی 1396, 11:42 صبح
فقط حواستون باشه به این صورت که نوشتید باعث میشه دو تا آبجکت MyClass داشته باشید که هر دو st اشون یکی باشه و اگر محتوای یکی رو تغییر بدی اون یکی هم تغییر میکنه.
به نکته خوبی اشاره کردی حواسم به این موضوع نبود . ولی در این مورد نمیخاستم تغییری روش ایجاد کنم.
اما برای کپی کردن از کلاس فعلی معمولا از کانستراکتور استفاده نمیکنن. می تونید متد clone رو override کنید.
در مورد این تو سایت stackoverflow یکی نوشته بود و این راه رو پیشنهاد داده بود که از کانستراکتور استفاده کنید و بهتره که از clone استفاده نکنید حالا چراش رو نمیدونم!
فک کنم باید از clone استفاده کنم یا اینکه تفاوت بین کانستراکتور ها . تشکر
vahid-p
چهارشنبه 27 دی 1396, 14:22 عصر
از کانستراکتور استفاده کنید و بهتره که از clone استفاده نکنید حالا چراش رو نمیدونم!
درسته قبلا همچین چیزی رو خونده بودم، ولی منم علت اصلیش رو یادم نمیاد. شاید ممکنه پیاده سازی دقیقش دشوار باشه (مثلا همینکه گفتم به primitive بودن، immutable بودن، ایجاد آبجکت جدید برای هر شی و... توجه کنید) ولی copy constructor هم در برخی موارد ممکنه دردسر ساز بشه همونطور که در نتیجه گیری این مقاله اومده:
https://www.javacodegeeks.com/2014/01/which-is-better-option-cloning-or-copy-constructors.html
mostafa3dmax
پنج شنبه 28 دی 1396, 12:35 عصر
درسته قبلا همچین چیزی رو خونده بودم، ولی منم علت اصلیش رو یادم نمیاد. شاید ممکنه پیاده سازی دقیقش دشوار باشه (مثلا همینکه گفتم به primitive بودن، immutable بودن، ایجاد آبجکت جدید برای هر شی و... توجه کنید) ولی copy constructor هم در برخی موارد ممکنه دردسر ساز بشه همونطور که در نتیجه گیری این مقاله اومده:
https://www.javacodegeeks.com/2014/01/which-is-better-option-cloning-or-copy-constructors.html
طبق نتیجه گیریش بهترین حالت، حالت 5ش بود که ترکیبی از دوتاست ینی هم کانستراکتور هم کپی ! ولی در کل کپی کردن یه آبجکت چقد دردسر داره :متفکر:
تو زبان های دیگه مثه c# یا c++ یا php هم همین مشکل هست آیا ؟
vahid-p
پنج شنبه 28 دی 1396, 23:10 عصر
تو زبان های دیگه مثه C# یا C++ یا php هم همین مشکل هست آیا ؟
php فکر کنم داره. در اصل جاوا با متد clone و interface Clonable میخواسته این امکان رو بده که به صورت سلسله مراتبی هر کدوم clone بعدی رو در clone صدا میزنن و... . برای آبجکت های ساده کار سختی نیست.
ضمنا اگر object Serializable باشه هم میتونید اول Serialize اش کنید و بعد deserialize و اینم ممکنه جواب بده. ولی در کل بله، این مشکل برای اکثر زبان های شی گرا وجود داره
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.