ما هو الخطأ في المجموعات في Java ولماذا لن تساعد الجوافة

المقدمة


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


إطار مجموعات جافا والثبات على الثقة


في البداية ، تم تطوير إطار المجموعات دون اعتبار لحقيقة أن الحاويات الثابتة قد تظهر هناك. واجهة java.util.Collectionتحتوي على أساليب add، clear، removeالخ في الإصدارات اللاحقة ستضيف جميع الأدوات المساعدة المفضلة لديك: Collections.emptyList()، Collections.singletonList<T>(T t)، Arrays.asList<T>(T.. values)وغيرها. من هنا حيث بدأت المشاكل. دعونا نلقي نظرة على الكود التالي:


List<Integer> list = Arrays.asList(21, 22, 23);
list.add(24)        //  ! UnsupportedOperationException

كيف ذلك؟ بعد كل شيء ، يتم java.util.Listالوراثة من الواجهة java.util.Collection، حيث توجد بالتأكيد طريقة add. والحقيقة أن Arrays.asList<T>(T... t)يعود تنفيذ، والذي الطرق addو removeرمي استثناء. هنا نحصل على موقف غريب: الطريقة موجودة في الواجهة ، لكن لا يمكننا تسميتها. ومع ذلك ، يصبح الوضع أكثر غرابة إذا حاولنا تغيير قيمة بعض العناصر.


List<Integer> list = Arrays.asList(21, 22, 23);
list.set(0, 121);
System.out.println(list);        // [121, 22, 23]

. . , . , , , . .


List<Integer> filtered = filter(List<Integer> list);

filter List<Integer> . ? , ? try {} catch(Exception e) {} add remove — . ? ? list, filtered? . , . , — . , , list.clear(), , . SOLID, L — , , . , add , .


- , Stream API. , Java , , , . , , .


, java.util.Collection, java.util.Iterable, Collection. Iterable , Iterator, for-each . .


public interface Iterator<E> {
    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

remove. , for-each, , , API , , . - , , , , Java , .


Guava


Guava? — ImmutableList.


ImmutableList<String> people = ImmutableList.of("Michael", "Simon", "John")
...

? «Immutable». , ImmutableList java.util.List, add, clear ... , . , final. : , List Collection. , ImmutableList, , , « ». Guava .


Kotlin


? , JetBrains Kotlin. , , , . :


صورة


, , , .


val list: List<Int> = listOf(1, 2, 3)
val mutableList: MutableList<Int> = list as MutableList<Int>
mutableList.clear()      //  !  UnsupportedOperationException

- , MutableList List MutableList, , . , Java Collections Framework, Guava: , . , , . , Java, - , , , .



? ? , : , , , . . Java Collections Framework Immutable. :


صورة


, , «Immutable». , . , ImmutableQueue, , . . LinkedList , , ( , ). ImmutableLinkedList .


- , , . List ImmutableList. , toMutableList toImmutableList ImmutableList List . , , . , ArrayList ImmutableArrayList . . ArrayList , ImmutableArrayList, ImmutableArrayList ArrayList. API , .


, — java.util.Iterable. , for-each , . java.util.Iterator, , remove, . , .


  1. ImmutableIterable, ImmutableIterator. , , Java for-each Iterable, ImmutableIterable.
  2. ImmutableIterator, java.util.Iterator remove, final, . , .
  3. remove Iterator, , Java, , .


, Java JP . , — , Java-. , , . !


P.S.


أعمل حاليًا على مكتبة مفتوحة المصدر توفر مجموعات جافا ثابتة تمامًا. يمكن للمهتمين العثور على الرابط في Github .


All Articles