2016-03-25 5 views
0

У меня есть этот фрагмент, где я хочу вернуть один экземпляр board для проверки решения. Каков хороший способ вернуть один элемент и выпустить Итератор?Внедрить интерфейс Iterable с одним элементом

Размещать его final List, а затем опорожнять его единственным вариантом?

public Iterable<Board> solution() { 
     return new Iterable<Board>() { 
      @Override 
      public Iterator<Board> iterator() { 
       return new Iterator<Board>() { 
        @Override 
        public boolean hasNext() { 
         return false; // change this 
        } 

        @Override 
        public Board next() { 
         return board; // This does not work 
        } 

        @Override 
        public void remove() { 

        } 
       }; 
      } 
    }; 
} 
+0

Вы хотите использовать это в тесте, и это не производственный код? – hotzst

+0

Да, определенно и понять. –

ответ

5

Я думаю, что вы могли бы быть overthinking это только немного, любой Collection является Iterable, так что вы могли бы сделать что-то просто:

public Iterable<Board> solution() { 
    return Collections.singleton(board); 
} 
+1

Collections.singleton(), вероятно, будет лучше в этой ситуации. – JustinKSU

+0

@JustinKSU - Я согласен, гораздо более подробно описываю то, что вы пытаетесь выполнить. Я отредактировал это. Спасибо. – nickb

+0

[OP] Конечно, спасибо! Это один из подходов. Если мне не нужны коллекции, мне нужно будет сделать что-то вроде того, что делает синглтон при повторении. Этот ответ привел меня к этому. –

0

Ответ дается @nickb привести меня к как Singleton реализует итератор, и я мог бы придумать следующий подход (для моего обучения/тестирования). Для производственного кода я предпочту ответ @ nickb.

public Iterable<Board> solution() { 
    return new Iterable<Board>() { 
     /** 
     * Returns an iterator over a set of elements of type T. 
     * 
     * @return an Iterator. 
     */ 
     @Override 
     public Iterator<Board> iterator() { 

      return new Iterator<Board>() { 
       private boolean hasNext = true; 
       @Override 
       public boolean hasNext() { 
        return hasNext; 
       } 

       @Override 
       public Board next() { 
        if (hasNext) { 
         hasNext = false; 
        } 
        return board; 
       } 
       @Override 
       public void remove() { 

       } 
      }; 
     } 
    }; 
} 
+0

Обратите внимание, что это все равно возвращает объект платы при повторных вызовах для следующего. Возможно, вы хотите, чтобы предложение else выдавало исключение NoSuchElementException, если hasNext уже был ложным. Возможно, также лучше всего, чтобы метод remove выбрал UnsupportedOperationException, если вы собираетесь его не делать. – user3745362

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