في هذه السلسلة من المنشورات، أقوم بمقارنة طرق مختلفة لترميز نفس الوظيفة. آخر مشاركة قارنت Collections.singletonList وArrayList لإنشاء قائمة ذات عنصر واحد.
في هذا المنشور سأقارن Collections.singletonList مع طريقة مصنع أخرى معروفة، List.of.
قائمة
public static void main(String[] args) { final var addresses = Collections.singletonList( new Address( "742 Evergreen Terrace", "Springfield", "New York", "13468", "US" )); System.out.println(addresses); }
تقوم هذه الطريقة بإرجاع قائمة غير قابلة للتغيير تحتوي على الكائن المحدد فقط. تم تقديمه في Java 1.3. تمت تغطية المزايا التي توفرها ArrayList في المشاركة الأخيرة، ولكن للتلخيص:
قائمة
public static void main(String[] args) { final var addresses2 = List.of( new Address( "1007 Mountain Drive", "Bristol Township", "New Jersey", null, "US" )); System.out.println(addresses2); }
طريقة List.of(E e) هي أيضًا طريقة مصنع تقوم بإرجاع قائمة غير قابلة للتعديل. على عكس Collections.singletonList(E e)، الذي يدعم عنصرًا واحدًا فقط، يدعم List.of 0 إلى 10 عناصر، بالإضافة إلى المصفوفات التي تحتوي على عناصر متعددة. تم تقديمه في Java 9، بعد 17 عامًا من SingletonList.
من المثير للاهتمام أنه، على عكس SingletonList، الذي يحتوي على التعليق:
يُرجع قائمة غير قابلة للتغيير تحتوي على الكائن المحدد فقط.
ينص Array.of على أنها قائمة غير قابلة للتعديل:
إرجاع قائمة غير قابلة للتعديل تحتوي على عنصر واحد.
يعكس هذا فهمًا جديدًا لثبات المجموعات. وفقا لهذه الوثائق:
تعتبر المجموعة غير قابلة للتعديل إذا تعذر إضافة العناصر أو إزالتها أو استبدالها. ومع ذلك، فإن المجموعة غير القابلة للتعديل تكون غير قابلة للتغيير إلا إذا كانت العناصر الموجودة في المجموعة غير قابلة للتغيير.
على الرغم من هذه الاختلافات في المصطلحات، فإن كلتا طريقتي المصنع لهما نفس الوظيفة تقريبًا. إذا نظرنا بشكل أعمق داخل القائمة غير القابلة للتعديل، يمكننا أن نجد:
staticList of(E e1) { return new ImmutableCollections.List12(e1); }
يا لها من مفاجأة، فقد اختاروا المصطلح غير الدقيق غير قابل للتغيير، رغم ذلك!
static final class List12extends AbstractImmutableList implements Serializable { @Stable private final E e0; @Stable private final E e1; List12(E e0) { this.e0 = Objects.requireNonNull(e0); this.e1 = null; } ... }
static abstract class AbstractImmutableListextends AbstractImmutableCollection implements List , RandomAccess { // all mutating methods throw UnsupportedOperationException @Override public void add(int index, E element) { throw uoe(); } @Override public boolean addAll(int index, Collection extends E> c) { throw uoe(); } @Override public E remove(int index) { throw uoe(); } @Override public void replaceAll(UnaryOperator operator) { throw uoe(); } @Override public E set(int index, E element) { throw uoe(); } @Override public void sort(Comparator super E> c) { throw uoe(); }
الفرق الوحيد هو أن List12 يحتوي على حقلين لعنصرين محتملين، مما يؤدي أيضًا إلى بصمة ذاكرة ضئيلة ما لم تتعامل مع كائنات كبيرة.
هذه المرة، قمنا بمقارنة طرق Collections.singletonList وList.of Factory لإنشاء قائمة مكونة من عنصر واحد. ناقشنا دلالات غير قابل للتغيير و غير قابل للتعديل وأظهرنا أن كلا الطريقتين فعالتان وموجزتان وخفيفتان للموارد. إذا كان بإمكانك استخدام إصدار Java أحدث، فمن الأفضل أن يكون مألوفًا ووضوحًا ولأننا نستخدم واجهة القائمة أكثر بكثير من المجموعات. إذا اقتصر الأمر على إصدار Java الأقدم، فستظل Collections.singletonList خيارًا قويًا.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3