Collections.unmodifiableList wraps already unmodifiable list?

1.4k Views Asked by At

In Collections.unmodifiableList implementation I see that it always wraps the given list with UnmodifiableList even if the given list is already UnmodifiableList... So if i'm calling this method over and over - i get a huge stack trace, like this:

  at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)

I thought to check if the list is already UnmodifiabelList and just return the same list, like Google's collections does, but this is not a public class..

Any suggeestions how to solve this elegantly?

Thanks

1

There are 1 best solutions below

0
On

A workaround I see, if you can modify all the places where the lists are wrapped, is to use your own unmodifiable list wrapper, and check if the list is not already an instance of this list wrapper before wrapping it.

Another workaround would be to use

private static final Class<?> UNMODIFIABLE_LIST_CLASS = 
    Collections.unmodifiableList(new ArrayList<Object>(0)).getClass();

...

if (!theList.getClass().equals(UNMODIFIABLE_LIST_CLASS)) {
    return Collections.unmodifiableList(theList);
}