Most efficient way to prevent an infinite recursion in toString()?

前端 未结 9 1531
南方客
南方客 2020-12-15 21:20

To string on a collection can get into a infinite loop if somewhere in the graph of collected items is a reference back to itself. See example below.

Yes, good cod

9条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-15 21:50

    The threadlocal bit I mentioned in the question:

    public class AntiRecusionList extends ArrayList {
    
    
    private final ThreadLocal, ?>> fToStringChecker =
            new ThreadLocal, ?>>() {
                @Override
                protected IdentityHashMap, ?> initialValue() {
                    return new IdentityHashMap<>();
                }
            };    
    
    @Override
    public String toString() {
        boolean entry = fToStringChecker.get().size() == 0;
        try {
            if (fToStringChecker.get().containsKey(this)/* test if "this" has been seen before */) {
                return "{skipping recursion}";
            } else {
                fToStringChecker.get().put(this, null);
                entry = true;
            }
            return super.toString();
        } finally {
            if (entry)
                fToStringChecker.get().clear();
        }
    }
    }
    

提交回复
热议问题