logo

قائمة غير قابلة للتغيير في جافا

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

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

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

إعلان الطبقة

في جافا، قائمة غير قابلة للتغيير الطبقة هي جزء من الجوافة مكتبة، والتي توفر العديد من فئات المجموعة غير القابلة للتغيير. ليستخدم قائمة غير قابلة للتغيير ، نقوم أولاً باستيراد ملف com.google.common.collect الحزمة التي تحتوي على قائمة غير قابلة للتغيير فصل.

إعلان الطبقة قائمة غير قابلة للتغيير على النحو التالي:

repl في جافا
 public abstract class ImmutableList extends ImmutableCollection implements List 

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

التسلسل الهرمي الطبقي

ال قائمة غير قابلة للتغيير الطبقة تنفذ قائمة الواجهة وتمثل قائمة لا يمكن تعديلها بمجرد إنشائها.

التسلسل الهرمي الطبقي قائمة غير قابلة للتغيير على النحو التالي:

 java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList 

هنا، مجموعة غير قابلة للتغيير هي فئة مجردة توفر تنفيذًا هيكليًا لـ مجموعة غير قابلة للتغيير الواجهة التي قائمة غير قابلة للتغيير يمتد.

بشكل عام، قائمة غير قابلة للتغيير يوفر class طريقة مريحة وفعالة لإنشاء واستخدام قوائم غير قابلة للتغيير في Java.

إنشاء قائمة غير قابلة للتغيير

هناك طرق مختلفة لإنشاء ImmutableList في Java، اعتمادًا على إصدار Java الذي تستخدمه والمكتبات المتوفرة لديك. وهنا بعض الأمثلة:

1. باستخدام طريقة Java 9 of():

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

خطوات العثور على الحل مذكورة أدناه.

  1. استيراد فئة القائمة من حزمة Java.util: والتي تسمح للبرنامج باستخدام واجهة القائمة لإنشاء قوائم الكائنات ومعالجتها.
  2. إنشاء قائمة غير قابلة للتغيير باستخدام طريقة Java 9 Factory: يستخدم الكود طريقة List.of() لإنشاء قائمة غير قابلة للتغيير من السلاسل مع أربعة عناصر.
  3. محاولة تعديل القائمة: يحاول البرنامج إضافة عنصر إلى القائمة غير القابلة للتغيير باستخدام طريقة add()، وهو أمر غير مسموح به في القوائم غير القابلة للتغيير. ونتيجة لذلك، يلتقط البرنامج UnsupportedOperationException الذي تم طرحه بواسطة طريقة add() ويطبع رسالة تشير إلى أنه لا يمكن تعديل القائمة.

اسم الملف: ImmutableListExample.java

أُووبس
 // Import the required List class from the Java.util package import java.util.List; // Define the class name public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Java 9 factory of() method List fruits = List.of('apple', 'banana', 'orange', 'grape'); // Print the elements of the List System.out.println('Fruits: ' + fruits); // Try to modify the List (will throw UnsupportedOperationException) try { fruits.add('pineapple'); } catch (UnsupportedOperationException ex) { System.out.println('Cannot modify immutable list.'); } } } 

انتاج:

 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 

2. استخدام فئة ImmutableList.Builder من مكتبة Guava:

إضافة عناصر إلى القائمة بأسلوب سلس، مما يجعلها ملائمة لإنشاء القائمة بشكل متزايد.

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

فيما يلي الحل التدريجي للكود المحدد:

  1. استيراد الفئات المطلوبة: قم باستيراد واجهة القائمة وفئة ImmutableList من الحزمة com.google.common.collect.
  2. إنشاء قائمة غير قابلة للتغيير باستخدام المنشئ: قم بإنشاء قائمة غير قابلة للتغيير باستخدام منشئ ImmutableList. استخدم طريقة add() لإضافة عناصر إلى القائمة، واستدعاء طريقة build() لإنشاء قائمة غير قابلة للتغيير.
  3. إنشاء قائمة غير قابلة للتغيير من قائمة موجودة: قم بإنشاء كائن قائمة بالعناصر المطلوبة. ثم قم باستدعاء الأسلوب ImmutableList.copyOf()، وتمرير القائمة كمعلمة، لإنشاء قائمة غير قابلة للتغيير.
  4. إضافة المزيد من العناصر: استخدم منشئ ImmutableList لإضافة المزيد من العناصر باستخدام طريقة addAll()، واستدعاء طريقة build() لإنشاء قائمة غير قابلة للتغيير.
  5. طباعة القوائم: استخدم طريقة System.out.println() لطباعة محتويات القوائم غير القابلة للتغيير.

تطبيق:

اسم الملف: ImmutableListExample.java

الربيع ام في سي
 import java.util.List; import com.google.common.collect.ImmutableList; public class ImmutableListExample { public static void main(String[] args) { // Creating an immutable list using the builder ImmutableList immutableList1 = ImmutableListbuilder() .add('Welcome') .add('to') .add('home') .build(); // Creating an immutable list from an existing list List existingList = List.of('Welcome', 'to', 'home', 'Think'); ImmutableList immutableList2 = ImmutableList.copyOf(existingList); // Creating an immutable list from an existing list and adding more elements ImmutableList immutableList3 = ImmutableList.builder() .addAll(existingList) .add('Big') .build(); // Let's print the lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); System.out.println('Immutable List 3: ' + immutableList3); } } 

انتاج:

 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. باستخدام طريقة () لفئة ImmutableList

تتيح لك طريقة of() الخاصة بفئة ImmutableList في مكتبة Guava إنشاء قائمة غير قابلة للتغيير بعدد ثابت من العناصر. بمجرد إنشاء القائمة، لا يمكنك إضافة عناصرها أو إزالتها أو تعديلها.

اسم الملف: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.List; class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Guava library's ImmutableList class ImmutableList fruits = ImmutableList.of('apple', 'banana', 'orange', 'grape'); // Print the contents of the immutable List System.out.println('Fruits: ' + fruits); } } 

انتاج:

 Fruits: [apple, banana, orange, grape] 

4. باستخدام طريقة CopyOf ().

في Java، تقوم طريقة CopyOf () بإنشاء مصفوفة جديدة تنسخ مصفوفة موجودة بطول محدد. تأخذ الطريقة وسيطتين: المصفوفة المراد نسخها وطول المصفوفة الجديدة.

اسم الملف: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.*; class ImmutableListExample { public static void main(String[] args) { // Create an ArrayList and add elements to it List myArrayList = new ArrayList(); myArrayList.add('Java'); myArrayList.add('Python'); myArrayList.add('C++'); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList1 = ImmutableList.copyOf(myArrayList); // Create an array and convert it to a list String[] myArray = {'Learning', 'Web', 'Development', 'is', 'Fun'}; List myList = Arrays.asList(myArray); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList2 = ImmutableList.copyOf(myList); // Print the contents of the immutable lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); } } 

انتاج:

 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 

5.UnsupportedOperationException

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

خطوات العثور على الحل مذكورة أدناه:

  1. أولاً، نقوم بإنشاء متغير ArrayList تحتوي على بعض العناصر الأولية باستخدام ل الطريقة، والتي تقوم بإرجاع قائمة غير قابلة للتغيير. ثم نمرر هذا ArrayList إلى Collections.unmodifiableList الطريقة، التي تُرجع عرضًا ثابتًا للقائمة.
  2. نحاول تعديل القائمة غير القابلة للتغيير باستخدام ملف اضف احذف ، و تعيين نظرًا لأن القائمة غير قابلة للتغيير، فإن محاولة تعديلها ستؤدي إلى حدوث خطأ UnsupportedOperationException .
  3. نحن قبض على UnsupportedOperationException الذي يتم طرحه وطباعة رسالة إلى وحدة التحكم تشير إلى العملية التي تمت محاولتها والتي لم تنجح.

نلاحظ أن Collections.unmodifiableList تقوم الطريقة فقط بإنشاء عرض غير قابل للتغيير للقائمة الأصلية. سوف يعكس العرض غير القابل للتغيير تلك التغييرات إذا تم تعديل القائمة الأصلية. لإنشاء قائمة غير قابلة للتغيير حقًا ولا يمكن تعديلها بأي وسيلة، يمكنك استخدام تطبيق مخصص لـ قائمة الواجهة التي تطرح استثناءً عند محاولة تعديل القائمة.

سلسلة جافا إلى json

تطبيق:

اسم الملف: ImmutableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using Collections.unmodifiableList List immutableList = Collections.unmodifiableList(new ArrayList(List.of('foo', 'bar', 'baz'))); // Attempt to modify the immutable List using various methods try { immutableList.add('qux'); System.out.println('Successfully added element to immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.remove(0); System.out.println('Successfully removed element from immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.set(0, 'qux'); System.out.println('Successfully modified element in immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } } } 

انتاج:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() هي طريقة في Java Collections Framework تقوم بإنشاء عرض غير قابل للتعديل لقائمة موجودة. يمكن استنتاج أن محاولة تعديل القائمة غير القابلة للتعديل ستؤدي إلى حدوث UnsupportedOperationException. لا يزال من الممكن تعديل القائمة الأصلية، وستنعكس أي تغييرات في القائمة غير القابلة للتعديل.

يعرض البرنامج كيفية استخدام طريقة Collections.unmodifiableList() لإنشاء تمثيل غير قابل للتعديل لقائمة قابلة للتغيير.

خطوات العثور على الحل مذكورة أدناه:

  1. إنشاء قائمة قابلة للتغيير mutableList وإضافة بعض العناصر إليه باستخدام يضيف() طريقة ArrayList
  2. قم بإنشاء عرض غير قابل للتعديل للقائمة القابلة للتغيير mutableList باستخدام قائمة غير قابلة للتعديل () الطريقة وتعيينها للمتغير unmodifiableList .
  3. حاول تعديل القائمة غير القابلة للتعديل unmodifiableList باستخدام يضيف() نظرًا لأن القائمة غير القابلة للتعديل للقراءة فقط، فسيؤدي ذلك إلى ظهور خطأ UnsupportedOperationException . تتم طباعة رسالة إلى وحدة التحكم بعد التقاط هذا الاستثناء.
  4. تعديل القائمة القابلة للتغيير الأصلية mutableList وذلك بإضافة عنصر آخر باستخدام يضيف()
  5. قم بطباعة كل من القوائم القابلة للتغيير وغير القابلة للتعديل على وحدة التحكم لإظهار أن القائمة غير القابلة للتعديل تعكس التغييرات التي تم إجراؤها على القائمة القابلة للتغيير الأصلية.

اسم الملف: UnmodifiableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UnmodifiableListExample { public static void main(String[] args) { List mutableList = new ArrayList(); mutableList.add('apple'); mutableList.add('banana'); mutableList.add('orange'); // Create an unmodifiable view of the mutableList List unmodifiableList = Collections.unmodifiableList(mutableList); // Attempt to modify the unmodifiableList will throw UnsupportedOperationException try { unmodifiableList.add('pear'); } catch (UnsupportedOperationException e) { System.out.println('Attempt to modify unmodifiableList failed: ' + e.getMessage()); } // The original mutableList can still be modified mutableList.add('pear'); // The unmodifiableList will reflect the changes made to the original mutableList System.out.println('mutableList: ' + mutableList); // [apple, banana, orange, pear] System.out.println('unmodifiableList: ' + unmodifiableList); // [apple, banana, orange, pear] } } 

انتاج:

 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] 

مزايا القائمة غير القابلة للتغيير

تتمتع ImmutableList بالعديد من المزايا، بما في ذلك:

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