2013-04-07 3 views
0

У меня есть класс, который реализует Iterable, но с собственными hasNext() и next() методами, как это:Java - Итерируемый с собственными hasNext() и next(): как это сделать правильно?

public class BLMovie implements Iterable<BLMovieFrame> { 

@Override 
public Iterator<BLMovieFrame> iterator() { 
    iteratorVar = 0; 
    return liste.iterator(); 
} 

public boolean hasNext() { 
    if (loop) 
     return true; 
    return iteratorVar < liste.size(); 
} 

public BLMovieFrame next() { 
    iteratorVar = (iteratorVar++)%(liste.size()-1); 
    return liste.get(iteratorVar); 
} 

public void remove() { 
    throw new UnsupportedOperationException(); 
} 

Я довольно уверен, что это не самый лучший способ сделать это,
другие темы о Iterable не похоже, беспокоятся о собственных методах, так кто-то имеет для меня совет?

+0

Вам действительно нужно переопределить методы hasnext() и next()? – TheEwook

+0

@ TheEwook Да из-за атрибута loop –

+0

@ TheEwook Извините, что немного поздно, но я просто подумал об этом и задался вопросом: как я мог НЕ переопределить эти методы, так как я должен определить новый итератор в iterator() в любом случае? Я бы просто их во внутреннем классе –

ответ

4

Ваши методы определены в неправильном классе. Методы hasNext, next и remove должны быть определены в реализации Iterator, а не на Iterable. Если вы разместили аннотацию @Override для каждого метода, компилятор проинформировал вас об этой ошибке.

Как это, вы можете:

  • Создать анонимный внутренний класс для итератора, и перенести эти методы в тело
  • Создать автономный класс для итератора, и еще раз, шаг эти методы в него

Обратите внимание: если вы сделаете это, вы больше не сможете использовать итератор встроенного списка, но вы будете эффективно определять свои собственные (хотя вы можете его обернуть, конечно).

+0

А вы имеете в виду сделать собственный итератор, такой как BLMovieIterator, а затем вернуть новый объект этого метода в методе итератора()? –

+0

В принципе, да .... –

+0

@Big_Chair - да, вот что я имею в виду. – Perception

2

На самом деле вы не будете обрабатывать свои методы итератора, так как вы фактически возвращаете итератор своего объекта liste.

Если вы хотите реализовать свой собственный итератор, лучший способ - создать анонимный внутренний класс.

@Override 
     public Iterator<BLMovieFrame> iterator() { 
      // TODO Auto-generated method stub  
      return new Iterator <BLMovieFrame>(){ 

       @Override 
       public boolean hasNext() { 
        if (loop) 
         return true; 
        return iteratorVar < liste.size(); 
       } 

       @Override 
       public BLMovieFrame next() { 
         iteratorVar = (iteratorVar++)%(liste.size()-1); 
       return liste.get(iteratorVar); 
       } 
      @Override 
      public void remove() { 
        throw new UnsupportedOperationException(); 
      }    
      }; 
+0

Хорошо спасибо за пример –

 Смежные вопросы

  • Нет связанных вопросов^_^