تبلیغات

قطعه کد کپی آبجکت به متغیر جدید در جاوا بدون اشاره به قبلی

قطعه کد کپی یک آبجکت به متغیر دیگر در جاوا بدون اشاره به آبجکت قبلی


وقتی یک آبجکت را به یک آبجکت دیگر، از یک کلاس یکسان نسبت می‌دهیم، در واقع یک کپی ایجاد نشده و تنها دو متغیر به یک چیز اشاره می‌کنند. که یعنی دو اشاره‌گر وجود دارد! و اگر تغییراتی در فیلدهای یکی از آن‌ها روی دهد، دیگری نیز تغییر می‌کند! برای درک این گفته در ادامه مثالی را می‌زنیم.

مثال:

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 به یک آبجکت جدید اشاره خواهد کرد!

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

یه کلاسِ تعریف نشده ... فقط برای ارتباط کاری تلگرام پیام بدید ...

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک