What is wrong with collections in Java and why Guava will not help

Introduction


The title of the post is really “holivny”, but in my opinion both Java and the popular Guava library have a number of architectural problems that in the long run lead to ambiguities and disagreements in the team.
image


Java Collections Framework and immutability on trust


Collections Framework , . 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. , , , . :


image


, , , .


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. :


image


, , «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.


I'm currently working on an open-source library that provides fully immutable Java collections. Those interested can find the link on Github .


All Articles