duduamar
duduamar

Reputation: 3924

Collections.unmodifiableList wraps already unmodifiable list?

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

Upvotes: -3

Views: 1495

Answers (1)

JB Nizet
JB Nizet

Reputation: 692231

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);
}

Upvotes: 2

Related Questions