Решение Питера Мааса, которое вы связываете, выглядит хорошо для меня - я настоятельно рекомендую вам поработать над этим, вместо того, чтобы тратить время на переизобретение этого. Просто замените Factory<T>
на Supplier<T>
(входит в коллекции Google). Его реализация subList также довольно умна, хотя и имеет некоторые специфические последствия: если вы получите subList()
и попытаетесь добавить элемент за пределы подсписка, вы не получите IndexOutOfBoundsException
(как правильный подсписок). должен сделать), но вы будете вставлять дополнительные элементы в список. Скорее всего, вам не понадобятся подсписки, поэтому самым безопасным было бы реализовать этот метод, выдав UnsupportedOperationException
(или создать LazyList с дополнительным флагом того, разрешено ли его увеличение с помощью вызовов get()
сверх его размера: если он создан subList
, то это не так).
size()
поддерживается (автоматически, ForwardingList
).
Обновление: Обратите внимание, что, как сказал Кевин, вы не объяснили, почему что-то подобное действительно будет тем, что вам нужно. Также, возможно, вы захотите подумать, может ли что-то подобное быть применимо:
final Supplier<T> supplier = ...;
Map<Integer, T> graphs = new MapMaker()
.makeComputingMap(
new Function<Integer, T>() {
public T apply(Integer index) {
return supplier.get();
}
});
Поскольку List<T>
и Map<Integer, T>
более или менее представляют один и тот же абстрактный тип данных, и поскольку из вашего комментария следует, что (1) вам не нравятся нулевые значения, которые следует рассматривать как элементы (хорошо!), И ( 2) что ваша структура может быть разреженной, тогда как фактический ArrayList будет расточительным.