/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.target.lazy; import java.util.AbstractList; import java.util.Iterator; import java.util.List; /** * Implements a lazily constructed list of objects backed by an array of source objects. */ /* package */abstract class LazyArrayList<T> extends AbstractList<T> { private final List<T> _raw; private final Object[] _resolved; public LazyArrayList(final List<T> raw) { _raw = raw; _resolved = new Object[raw.size()]; } @Override public int size() { return _resolved.length; } @Override public Iterator<T> iterator() { return new Iterator<T>() { private int _index; @Override public boolean hasNext() { return _index < _resolved.length; } @Override public T next() { return get(_index++); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } protected abstract T resolve(T object); @SuppressWarnings("unchecked") @Override public synchronized T get(final int index) { if (_resolved[index] == null) { _resolved[index] = resolve(_raw.get(index)); } return (T) _resolved[index]; } }