java - كلمة - في جافا ، ما هي نسخة ضحلة؟



اللغة العربية (6)

java.util.Calendar.clone () بإرجاع "... تقويم جديد مع نفس الخصائص" وإرجاع "نسخة ضحلة من هذا التقويم".

هذا لا يبدو أن نسخة ضحلة كما ورد here على SO. تم وضع علامة على هذا السؤال لغة اللاأدري ، لا يبدو جافا لمتابعة تعريف اللاغة اللغة. بينما أخطو خلال الكود ، ألاحظ أن البنية والعناصر يتم نسخها إلى هذا الكائن الجديد ، أكثر من البنية اللغوية اللاأدرية فقط.

في جافا ، ما هي نسخة ضحلة؟

كيف تختلف عن نسخة جافا عميق (إن وجدت)؟

https://src-bin.com


Answer #1

أولاً وقبل كل شيء ، Javadoc ArrayList خطأ إلى حد ما إذا كنا نتحدث عن صفائف أحادية البعد ، كما يستخدم الأسلوب copyOf في صفائف. لذا فإن الاستنساخ () يعيد نسخة أحادية البعد ، على الأقل منذ 1.5 (لم أختبرها)! هذا ما يعني "الضحلة" في جافا: أحادي البعد

يمكنك قراءة المزيد هنا: http://www.javapractices.com/topic/TopicAction.do?Id=3 . حتى استنساخ () ليست نسخة ضحلة! إذا كنت تريد نسخة ضحلة حقيقية من مصفوفة أحادية البعد ، فما عليك سوى الرجوع إليها:

Array a = new Array();
Array b = a;                    //a is only a shallow copy, nice for synchronisation

تعتبر المصفوفات في Java صعبة ، أيضًا لأن Java تتخطى القيمة ، لكن قيم المصفوفات هي فقط مؤشراتها! في المقابل ، هذا يسمح لنا بمزامنة الأشياء ، وهو أمر رائع. ومع ذلك ، توجد بعض المشكلات إذا كنت تستخدم صفائف داخل صفائف (أو ArrayLists) ، لأن لنسخة () من صفيف الحاوية (أو ArrayList) لن تنسخ قيمها ، فقط مراجعها! لذا يجب عليك ببساطة عدم وضع أي صفائف في مصفوفة ، يجب عليك فقط التعامل مع الكائنات في مجموعة!

ويصعب فهم Javadoc أحيانًا ، لذا جرّب تجربة الاختبار ...

إستمتع!


Answer #2

النسخة الضحلة هي مجرد مجموعة من المؤشرات إلى مواقع الذاكرة نفسها. في الواقع لا يخلق نسخة حقيقية لذا فإن استخدام الذاكرة أقل.

في حالة نسخة عميقة ، يتم إنشاء نسخة طبق الأصل من مقطع الذاكرة ويتم تعيين المؤشرات على مواقع الذاكرة الجديدة. لذا يجب أن يكون استهلاك الذاكرة مرتين في هذه الحالة.


Answer #3

مستند الإصدار 1.6 Calendar.clone باسم "إنشاء وإرجاع نسخة من هذا الكائن." نسخة ضحلة حرفية كما حددتها Object.clone لن يكون لها أي معنى. تستخدم Java المصطلح "نسخة ضحلة" بمعنى نموذجي.


Answer #4

من أين تحصل على هذه الوثائق؟

وثائق جافا 6 الرسمية على java.sun.com ببساطة يكون Calendar.clone() إرجاع نسخة من الكائن. لا يذكر الضحلة.

بشكل عام ، النسخة الضحلة في Java هي نسخة حيث تحصل على مرجع كائن جديد ولكن الكائن الجديد يحمل (بشكل مباشر أو غير مباشر) مراجع إلى البيانات في الأصل.

فمثلا:

class MyClass{
  private List<Integer> innerList;

  public MyClass(List<Integer> list) { innerList = list; }

  //Some code...

  public Object clone(){
    return new MyClass(innerList);
  }
}

إرجاع نسخة ضحلة في استنساخها ().


Answer #5

نسخة ضحلة فقط نسخ مرجع الكائن إلى المرجع الهدف. لا يقوم بإنشاء كائن جديد على الكومة. بشكل افتراضي ، تقوم Java بالاستنساخ الضحلة باستخدام وظيفة clone ().

للحصول على كائن جديد على الكومة ، يجب على المرء تنفيذ الاستنساخ العميق الذي يمكن تنفيذه عن طريق التسلسل وإلغاء التسلسل.


Answer #6

والنسخة الضحلة هي نسخة من المؤشر المرجعي للكائن ، في حين أن النسخة العميقة هي نسخة من الكائن نفسه. في Java ، يتم الاحتفاظ بالكائنات في الخلفية ، ما تتفاعل معه عادة عند التعامل مع الكائنات هو المؤشرات. تشير أسماء المتغيرات إلى مساحة الذاكرة للكائن. يتم إنشاء نسخة ضحلة عند تعيين متغير واحد يساوي متغير آخر مثل:

Object B = A;

يمكن عمل نسخة عميقة عن طريق الحصول على خصائص الكائن A ووضعها في كائن جديد B.

Object B = new Object(A.getProperty1(), A.getProperty2()...);

يؤثر هذا على سلوك البرنامج في ذلك إذا قمت بعمل نسخة ضحلة وتنفيذ مهمة عليها ، والتي تؤثر على جميع النسخ الضحلة من الكائن. إذا قمت بإجراء تغيير على نسخة عميقة ، تتأثر تلك النسخة فقط. آمل أن يكون هذا مفصلاً بما فيه الكفاية بالنسبة لك.





shallow-copy