Reputation: 3924
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
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