I found a clever way to detect cyclic calls in Google Collections:
private static class MemoizingSupplier<T> implements SerializableSupplier<T> { private final Supplier<T> delegate; private MemoizationState state = MemoizationState.NOT_YET; private T value; public MemoizingSupplier(Supplier<T> delegate) { this.delegate = delegate; } public T get() { switch (state) { case NOT_YET: state = MemoizationState.COMPUTING; try { value = delegate.get(); } finally { state = MemoizationState.NOT_YET; } state = MemoizationState.DONE; break; case COMPUTING: throw new CyclicDependencyException(); } return value; } private static final long serialVersionUID = 1138306392412025275L; }
I doubt it is original, but I have not run across this combining of cycle detection with memoizing before. That probably says more about me than Google.
No comments:
Post a Comment