Example List implementations - circular linked list - nodes in a cyclic graph - random number generator - repeating decimal places (such as the decimal representation of 1/3)
http://pivot.apache.org/2.0/docs/api/org/apache/pivot/collections/List.html#getLength() The javadoc states - 'Returns: The number of items in the list, or -1 if the list's length is not known. In this case, the iterator must be used to retrieve the contents of the list.' In the case of the examples listed above, I would expect the List to return a length of -1, which then means I should access its elements via an Iterator. However there is no mention about any contract regarding the iterator that the List implementation should return, and no way of asking the List whether or not it represents a finite list of values. This could cause problems when such a list is used as the model for a Pivot Component, as well as in general usage. One trivial example is the 'sizeToContent style in TerraSpinnerSkin. When set to true, it will use an Iterator to calculate the maximum rendered width of all elements in the Spinner's data model. This would trigger an infinite loop for a List with an infinite number of values. Obviously, TerraSpinnerSkin could decide to only process the first x many elements, or simply ignore the style if the length of the List cannot be determined, but similar logic would be needed anywhere that a Pivot List might be accessed via an Iterator. I'm not really sure the preferred way to address this, but here are a few ideas - Simply stress the *possibility* of an infinite sized list in the javadocs for org.apache.pivot.collections.List, and suggest limiting the number of iterations performed on an Iterator returned by a List whose length is reported as -1. - Add a method method directly to List that would at least allow the code using a List to see if it is of a finite length, but that would be a breaking API change. - Override the iterator() method for List to have return type of a Pivot subclass of Iterator which could be queried about its size. Again an API breaking change. public interface LengthIterator extends Iterator<T> { public enum Length { FINITE, INFINITE, UNKNOWN } public Length getLengthInfo(); } - Creation of a FiniteIterator class which would would wrap any existing Iterator and provide a means to limit the number of elements returned by an iterator. This could be used to protect against infinite loops by any code that iterates over all elements in a List. (and/or a FiniteIterable class wrap an entire List) - Specify that repeated calls to hasNext()/next() on any Iterator returned by a List should fail after X attempts (Integer.MAX_VALUE ?). Calling next() after X attempts should throw a MaximumIteratorSizeExceeded exception. This would prevent 'controlled' access to Lists where the next (single) element is simple read as it is required. Chris
