Skip to content

Instantly share code, notes, and snippets.

@yuba
Created June 1, 2014 13:21
Show Gist options
  • Save yuba/fafa0e961e66957c5f4b to your computer and use it in GitHub Desktop.
Save yuba/fafa0e961e66957c5f4b to your computer and use it in GitHub Desktop.
JavaコレクションクラスのtoString()をスレッドローカル変数で補強する ref: http://qiita.com/yuba/items/35fada18850578edea73
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
private static ThreadLocal<Set<Object>> stackedObjectsContainer = new ThreadLocal<>();
@Override
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
Set<Object> stackedObjects = stackedObjectsContainer.get();
if (stackedObjects == null) {
stackedObjects = new HashSet<Object>();
stackedObjectsContainer.set(stackedObjects);
}
stackedObjects.add(this);
try {
StringBuilder sb = new StringBuilder();
sb.append('[');
for (; ; ) {
E e = it.next();
sb.append(stackedObjects.contains(e) ? "(recursion)" : e);
if (!it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
} finally {
stackedObjects.remove(this);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment