البرمجة

تجنب تعديل المصفوفة المعطاة

في هذا المثال، يبدو أن هناك لبس بسيط في الفهم يتعلق بكيفية تعامل الجافا مع النماذج (Objects) والمتغيرات (Variables). دعني أشرح هذا بشكل مفصل:

عندما تقوم بتمرير مصفوفة given إلى الدالة adjust في السطر:

java
int[] changed = adjust(given);

أنت في الواقع تقوم بتمرير نسخة من المرجع (reference) لمصفوفة given، وليس نسخة جديدة من المصفوفة نفسها. وهذا يعني أن أي تغيير تقوم به داخل الدالة adjust على المصفوفة a سيؤثر مباشرة على المصفوفة given، لأن كلاهما يشيران إلى نفس المكان في الذاكرة.

بمعنى آخر، عندما تقوم بتعديل المصفوفة a داخل الدالة adjust، فإنك في الواقع تعدّل المصفوفة التي تمررها إليها (given)، ولا يتم إنشاء نسخة جديدة من المصفوفة.

لحل هذه المشكلة والحصول على نسخة جديدة من المصفوفة المعدلة، يمكنك ببساطة إنشاء نسخة جديدة من المصفوفة داخل الدالة adjust قبل تعديلها، مثل هذا:

java
private static int[] adjust(int[] a) { int[] newArray = Arrays.copyOf(a, a.length); // إنشاء نسخة جديدة من المصفوفة for (int i = 0; i < newArray.length; i++) { newArray[i]++; // تعديل المصفوفة الجديدة } return newArray; }

بهذا الشكل، ستقوم الدالة adjust بتعديل نسخة جديدة من المصفوفة المرسلة لها (given)، وبالتالي لن يتأثر المصفوفة الأصلية.

المزيد من المعلومات

بالتأكيد، دعني أوضح هذا الأمر بشكل أكبر وأعمق.

عندما يتم تمرير مصفوفة إلى دالة في جافا، فإنه لا يتم تمرير نسخة من المصفوفة نفسها، بل يتم تمرير “مرجع” أو “رابط” (reference) إلى المصفوفة. وبمعنى آخر، يشير المتغير الذي تمرره إلى الدالة إلى نفس الكائن (object) في الذاكرة الذي يشير إليه المصفوفة الأصلية.

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

لحل هذه المشكلة، يمكنك إنشاء نسخة جديدة من المصفوفة داخل الدالة قبل القيام بأي تعديل. ويمكن القيام بذلك باستخدام الدالة Arrays.copyOf() التي تنشئ نسخة جديدة من المصفوفة بحجم محدد.

في الكود السابق، تم استخدام Arrays.copyOf() لإنشاء نسخة جديدة من المصفوفة a قبل البدء في تعديلها. ثم تم تعديل المصفوفة الجديدة، وبالتالي لن يتأثر المصفوفة الأصلية given.

تحتوي هذه الطريقة على المزايا التالية:

  1. الوضوح والسهولة: يسهل فهم الكود وفهم ما يحدث بشكل أفضل، حيث يتضح أنك تعمل على نسخة جديدة من المصفوفة وليس على المصفوفة الأصلية مباشرة.

  2. السلامة: بإنشاء نسخة جديدة، يمكنك التأكد من عدم تغيير المصفوفة الأصلية بشكل غير مقصود، مما يزيد من سلامة البرنامج وتجنب الأخطاء.

  3. المرونة: يسمح لك هذا النهج بتعديل النسخة الجديدة بحرية دون أي تأثير على المصفوفة الأصلية، مما يجعل الكود أكثر مرونة وقابلية للتطوير في المستقبل.

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر