Таким образом, моя программа нуждается в типе кругового массива ArrayList.
Только круговая вещь об этом должна быть методом get (int index), это оригинал:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
Если индекс равен -1, он должен получить элемент с индексом ArrayList.size() - 1, а если index - ArrayList.size(), он должен получить элемент с индексом 0.
Самый простой способ добиться этого, который пришел мне на ум, - это просто расширить ArrayList из пакета java.util и просто переопределить индекс get (int), поэтому он не бросает IndexOutOfBoundsException для двух указанных выше индексов, но меняет их на то, что я хотеть. Он будет генерировать IndexOutOfBoundsException для любого другого индекса, который выходит за рамки.
Однако, поскольку elementData (index) получает доступ к
private transient Object[] elementData;
Я не могу заставить его работать, потому что мой класс не видит его с тех пор, как он закрыт.
Кроме того, я не хочу использовать для этого какие-либо внешние библиотеки, просто потому, что я думаю, что нет таких, которые бы удовлетворяли мои потребности, так как я не хочу реального кругового массива, но только часть его функциональности, остальная часть это регулярный ArrayList.
У меня есть два вопроса:
Как я могу сделать эту работу? Есть ли способ сделать это, не копируя весь класс ArrayList вместе с AbstractCollection, Collection и Iterable в мою программу? Это кажется плохим дизайном даже для меня.
Если я могу как-то заставить его работать, есть ли еще что-нибудь, за чем я должен следить? Если я сделаю изменения, описанные выше, изменит ли поведение класса только то, как я его хочу, или могут возникнуть какие-либо другие нежелательные изменения поведения?
EDIT: Спасибо за ответ, вот что я сделал:
import java.util.ArrayList;
public class CircularArrayList<E> extends ArrayList<E>
{
private static final long serialVersionUID = 1L;
public E get(int index)
{
if (index == -1)
{
index = size()-1;
}
else if (index == size())
{
index = 0;
}
return super.get(index);
}
}
Он будет обтекать ArrayList, но только одним. Я хочу, чтобы он выдавал исключение, если я пытаюсь получить доступ к любому другому элементу, кроме первого и последнего, с чем-либо, кроме своих обычных индексов ArrayList.