diff options
Diffstat (limited to 'main/src/cgeo/geocaching/utils/LazyInitializedList.java')
| -rw-r--r-- | main/src/cgeo/geocaching/utils/LazyInitializedList.java | 98 |
1 files changed, 29 insertions, 69 deletions
diff --git a/main/src/cgeo/geocaching/utils/LazyInitializedList.java b/main/src/cgeo/geocaching/utils/LazyInitializedList.java index 25af811..27649e8 100644 --- a/main/src/cgeo/geocaching/utils/LazyInitializedList.java +++ b/main/src/cgeo/geocaching/utils/LazyInitializedList.java @@ -1,103 +1,63 @@ package cgeo.geocaching.utils; +import java.util.AbstractList; import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; import java.util.List; +import java.util.concurrent.Callable; -public abstract class LazyInitializedList<ElementType> implements Iterable<ElementType> { +public abstract class LazyInitializedList<ElementType> extends AbstractList<ElementType> implements Callable<List<ElementType>> { private volatile List<ElementType> list; - private void initializeList() { + private List<ElementType> getList() { if (list == null) { - synchronized (this) { - if (list == null) { - list = loadFromDatabase(); + synchronized(this) { + try { + list = call(); + if (list == null) { + Log.e("LazyInitializedList.getList: null result"); + } + } catch (final Exception e) { + Log.e("LazyInitializedList.getList", e); } } } + return list; } - protected abstract List<ElementType> loadFromDatabase(); - - public void add(final ElementType element) { - initializeList(); - list.add(element); - } - - public void prepend(final ElementType element) { - initializeList(); - list.add(0, element); - } - - public void set(final List<ElementType> elements) { - if (elements != null) { - list = new ArrayList<ElementType>(elements); - } else { - list = new ArrayList<ElementType>(); - } - } - - public void set(LazyInitializedList<ElementType> other) { - if (other != null) { - list = new ArrayList<ElementType>(other.asList()); - } else { - list = new ArrayList<ElementType>(); - } + @Override + public boolean add(final ElementType element) { + return getList().add(element); } - public boolean isEmpty() { - initializeList(); - return list.isEmpty(); + @Override + public ElementType set(final int index, final ElementType element) { + return getList().set(index, element); } + @Override public ElementType remove(final int index) { - initializeList(); - return list.remove(index); + return getList().remove(index); } + @Override public void add(int index, final ElementType element) { - initializeList(); - list.add(index, element); + getList().add(index, element); } + @Override public int size() { - initializeList(); - return list.size(); + return getList().size(); } @Override - public Iterator<ElementType> iterator() { - initializeList(); - return list.iterator(); - } - public ElementType get(final int index) { - initializeList(); - return list.get(index); + return getList().get(index); } - public boolean contains(final ElementType element) { - initializeList(); - return list.contains(element); - } - - public boolean isNotEmpty() { - initializeList(); - return !list.isEmpty(); - } - - /** - * @return an unmodifiable list of the elements - */ - public List<ElementType> asList() { - initializeList(); - return Collections.unmodifiableList(list); + @Override + public void clear() { + list = new ArrayList<ElementType>(); } - public int indexOf(ElementType element) { - initializeList(); - return list.indexOf(element); - } } |
