قطعه کد کپی یک آبجکت به متغیر دیگر در جاوا بدون اشاره به آبجکت قبلی
وقتی یک آبجکت را به یک آبجکت دیگر، از یک کلاس یکسان نسبت میدهیم، در واقع یک کپی ایجاد نشده و تنها دو متغیر به یک چیز اشاره میکنند. که یعنی دو اشارهگر وجود دارد! و اگر تغییراتی در فیلدهای یکی از آنها روی دهد، دیگری نیز تغییر میکند! برای درک این گفته در ادامه مثالی را میزنیم.
مثال:
public class Main { public static class FuLLKade { public String name; } public static void main(String[] args) { FuLLKade fuLLKade1 = new FuLLKade(); fuLLKade1.name = "Hadi Akbarzadeh"; FuLLKade fuLLKade2 = fuLLKade1; System.out.println("fuLLKade 1 = " + fuLLKade1.name); System.out.println("fuLLKade 2 = " + fuLLKade2.name); fuLLKade1.name = "Hadi"; System.out.println("fuLLKade 1 = " + fuLLKade1.name); System.out.println("fuLLKade 2 = " + fuLLKade2.name); } }
با اجرای کد بالا، شما خروجی زیر را خواهید دید:
fuLLKade 1 = Hadi Akbarzadeh fuLLKade 2 = Hadi Akbarzadeh fuLLKade 1 = Hadi fuLLKade 2 = Hadi
همانطور که میبینید، در اینجا فقط fullkade1 را تغییر دادهایم؛ ولی fullkade2 نیز عوض شده است! برای رفع این مشکل، روشهای مختلفی وجود دارد که به یکی از آنها اشاره میکنیم.
روش حل این مشکل
تابع زیر که به روش Reflection نوشته شده است را در پروژهی خود کپی کنید:
public static Object cloneObject(Object obj) { try { Object clone = obj.getClass().newInstance(); for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); if (field.get(obj) == null || Modifier.isFinal(field.getModifiers())) { continue; } if (field.getType().isPrimitive() || field.getType().equals(String.class) || field.getType().getSuperclass().equals(Number.class) || field.getType().equals(Boolean.class)) { field.set(clone, field.get(obj)); } else { Object childObj = field.get(obj); if (childObj == obj) { field.set(clone, clone); } else { field.set(clone, cloneObject(field.get(obj))); } } } return clone; } catch (Exception e) { return null; } }
و حالا fullkade2 را به صورت زیر مقداردهی کنید:
FuLLKade fuLLKade2 = (FuLLKade) cloneObject(fuLLKade1);
بنابراین دیگر fullkade2 به یک آبجکت جدید اشاره خواهد کرد!
نظرات ثبت شده بدون دیدگاه