diff options
| author | Ben Culkin <scorpress@gmail.com> | 2020-11-21 11:02:48 -0500 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2020-11-21 11:02:48 -0500 |
| commit | 9273abd4c2df584b26841ac9cde958bda0c07769 (patch) | |
| tree | 2592b02e6d970ae4ec6491a8fd0a5a684abb6327 /src/main/java/bjc/data/NonCMEIterator.java | |
| parent | eee86f6e7e148fae897a333ab0ca9b44584c264c (diff) | |
Add iterators which don't throw ConcurrentModificationException
This adds two iterators (one iterator, one ListIterator) which are
guaranteed not to throw a ConcurrentModificationException. The intended
use case is allowing you to iterate over a list and modify it at the
same time.
Note that this will still give odd behavior in the presence of actual
concurrency, but that is a deliberate tradeoff.
Diffstat (limited to 'src/main/java/bjc/data/NonCMEIterator.java')
| -rw-r--r-- | src/main/java/bjc/data/NonCMEIterator.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main/java/bjc/data/NonCMEIterator.java b/src/main/java/bjc/data/NonCMEIterator.java new file mode 100644 index 0000000..88eaa6b --- /dev/null +++ b/src/main/java/bjc/data/NonCMEIterator.java @@ -0,0 +1,54 @@ +package bjc.data; + +import java.util.*; + +/** + * A Iterator which is guaranteed to never throw {@link ConcurrentModificationException}. + * + * The intended use case for this iterator is that you want to be able to modify + * a list you are iterating over, and not get an immediate exception. + * + * Note that using this is an agreement that you will not complain if it behaves + * oddly in the face of you concurrently modifying the list, as this class was + * designed with the usecase of modifying the list from the same thread, without + * invalidating the iterators. After all, there is a reason that most iterator + * types throw that exception. + * + * However, sometimes you want to play with fire, even if you might get burnt. + * This allows you to do so. + * + * @author Ben Culkin + * + * @param <ElementType> The type being iterated over. + */ +public class NonCMEIterator<ElementType> implements Iterator<ElementType> { + /** + * The list being iterated over. + */ + protected final List<ElementType> source; + + /** + * The index of the current item in the list. + */ + protected int currIndex; + + /** + * Create a new iterator which won't throw {@link ConcurrentModificationException} + * + * @param source The list being iterated over. + */ + public NonCMEIterator(List<ElementType> source) { + this.source = source; + this.currIndex = -1; + } + + @Override + public boolean hasNext() { + return currIndex >= source.size(); + } + + @Override + public ElementType next() { + return source.get(++currIndex); + } +}
\ No newline at end of file |
