2013-07-01 3 views
0

У меня есть класс java, который генерирует строки. Теперь я думал, что не хочу возвращать массив строк, но только одну строку за вызов с помощью метода getNextString. Затем можно вызвать метод в цикле, как, что:Образец для возврата следующего значения?

while(abc.getNextString() != null) { 
    ... 
} 

Я видел это несколько раз в Java я предполагаю, но теперь мне интересно, если есть образец или лучшая практика методов, как это? Метод зависит от начальных значений, поэтому где я должен их инициализировать? Что происходит, если инициализируемый метод вызывается другим типом кода прежде, чем все строки будут возвращены?

Может быть приятно увидеть что-нибудь об этом! :)

ответ

2

картина называется Iterator узор. Вероятно, вы хотите, чтобы ваш класс был implements Iterable<String>; тогда потребуется реализовать метод, который возвращает Iterator<String>.

Iterator<String> - одноименный итератор, поэтому инициализация произойдет, когда вы построили Iterator<String>.

Интерфейс Iterator<T> имеет немного более хороший апи, чем проверка на нуль, так что вы делаете:

while(myIterator.hasNext()) { 
    final String myString = myIterator.next(); 
} 

И если вы реализуете Iterable<String> затем усовершенствован для-каждого цикла будет фактически вызывать метод iterator() и построить петлю для вас, так что цикл становится

for(final String myString : abc) { 
} 

идея заключается в том, что каждый итератор не зависит, и поэтому вы не можете иметь проблемы с помощью метода инициализации Называния из строя.

Кроме того, теоретически вы могли бы иметь несколько потоков, идущих по их собственным итераторам, и это тоже не создавало бы проблем.

Наличие вашего Collection класса будет Iterator само по себе является плохая идея.

2

Это будет Итератор, который вы должны реализовать. Итератор сохраняет свою текущую позицию. Не должно быть метода initialize(). Вместо этого вы создаете Iterator в Iterable и убедитесь, что с помощью видимости (private, package private), что итератор не может быть подделан. Если Iterable, однако, можно редактировать одновременно, вы можете поддерживать счетчик версий с помощью Iterable, пусть Iterator проверяет на счетчик, изменился ли он и выбрал исключение ConcurrentModificationException, если это так.

0

Вам нужно две вещи, чтобы сделать эту работу:

  • строка генератор, который генерирует строку из строки,
  • свой собственный структура данных, которая запоминает последний сгенерированный код.

Что-то вроде:

public class StringGenerator { 

    private String lastString; 

    public StringGenerator() { 
     this(null); 
    } 

    public StringGenerator(String startString) { 
     lastString= startString; 
    } 

    public String getNextString() { 
     if (lastString == null) { 
      lastString= UUID.randomUUID().toString(); 
     } 
     lastString= generateString(lastString); 
     return lastString; 
    } 

    //private string generator (find any on the internet) 
    private String generateString(String str) { 
     .... maybe use md5 hash 
    } 
} 
Смежные вопросы