Как изменить методы итератора? - PullRequest
2 голосов
/ 26 ноября 2010

Эй, ребята, я новичок в Java, и у меня есть вопрос о коллекциях и итераторах.

В моем коде у меня есть коллекция (которая где-то в будущем расширяется, расширяет Iterable), и каждый объект в основном является LinkedList. Мне нужен итератор для этой коллекции, поэтому я записал это так:

public class A{

     LinkedList<B> BList= new LinkedList<B>();

    ...

    public Iterator<B> iterator() {
        return BList.iterator();
    }
}

Теперь вопрос в том, как я могу изменить любой метод этого итератора?
Или, если быть более точным, как я могу отключить метод удаления итератора?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

Вы можете вернуть итератор неизменяемого списка:

import java.util.Collections;

...

public class A{

    LinkedList<B> BList= new LinkedList<B>();

    ...

    public Iterator<B> iterator() {
        return Collections.unmodifiableList(BList).iterator();
    }
}

Это обернет ваш список реализацией, запрещающей любые изменения в структуре списка (например, удаление). Затем вы возвращаете итератор на основе свернутого списка.

3 голосов
/ 26 ноября 2010

Если вы хотите неизменяемый список, используйте другой ответ, размещенный здесь. Но если вы хотите отключить только удаление, возможный способ - создать новый класс, который расширяет интерфейс Iterator, но метод которого remove () выдает исключение (или просто ничего не делает) и пересылает все остальные методы к исходному объекту итератора:

public class MyIterator implements Iterator {
    private Iterator wrappedIterator;

    public MyIterator( Iterator it ) {
        wrappedIterator = it;
    }

    public void remove( blabla ) {
        //do nothing or raise an error, whatever floats your boat
    }

    public void otherIteratorMethod() {
        wrappedIterator.otherIteratorMethod();
    }
 }
...