Итератор следующий метод - PullRequest
5 голосов
/ 14 марта 2012

В ResultSet интерфейсе есть метод next, который возвращает логическое значение, и затем вы можете напрямую получить доступ к текущей записи с помощью get методов

Почему Iterator из java.util просто не пропал hasNext() method и имеет только next метод, который будет перемещать курсор к следующему элементу и возвращать boolean?

Ответы [ 3 ]

8 голосов
/ 14 марта 2012

Поскольку next() в настоящее время возвращает следующий элемент.

Java мог бы реализовать шаблон итератора так же, как это делает .NET, с MoveNext(), возвращающим логическое значение, а затем Current свойство с «текущим» значением - но оно по-прежнему состоит из двух членов ...

Другая альтернатива имеет одно возвращаемое значение, которое инкапсулирует две идеи «есть ли значение» и«каково значение, если оно есть» - действительно, типа Maybe.Конечно, в Java это означает выделение нового объекта на каждой итерации, что не идеально ...

2 голосов
/ 14 марта 2012

Поскольку для получения значения вам по-прежнему потребуется другая функция, то ничего не будет получено.

В ResultSet метод next () возвращает вас к следующей записи или возвращает false, если ее нет.Затем вы делаете getString (), getInt () или что-то еще, чтобы получить значения полей.Таким образом, вы пишете код вроде:

while (rs.next())
{
  name=rs.getString("name"); // or whatever
  ... do something with name ...
}

В Итераторе hasNext () возвращает true или false, чтобы указать, есть ли другая запись.Затем вы вызываете next (), чтобы получить значение.поэтому вы пишете код вроде:

while (iter.hasnext())
{
  name=iter.next(); // or whatever
  ... do something with name ...
}

Шаблон в конечном итоге очень похож.К сожалению, реализации противоречивы.То есть ResultSet.next не только сообщает вам, если вы находитесь в конце, но также продвигает позицию, в то время как Iterator.hasNext сообщает вам, если вы находитесь в конце, но не продвигает позицию.Но фактическое использование очень похоже.

На самом деле не стоит пытаться объединить Iterator.hasNext и Iterator.next в одну функцию.Как бы вы узнали, когда достигли конца?Вы могли бы сказать, что он возвращает ноль в конце ... но что, если нуль является допустимым значением в списке?Я полагаю, вы могли бы добавить какое-то магическое значение, но у вас все еще будет проблема отличить магическое значение от записи в списке, которая, как оказалось, имеет это значение.Например, если у вас есть список целых чисел, вы можете сказать, что -1 означает конец списка, но что, если список содержит значение -1?

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

while (true)
{
  IterableResult ir=iter.next();
  if (ir.end)
  {
    break;
  }
  else
  {
    name=ir.value;
    ... do something with name ... 
  }
}

Это, кажется, ничего не дает.

Может быть, есть другой подход, который будет работать лучше, но я не могу придумать один,И, видимо, создатели интерфейса Iterator также не могли придумать лучшего способа!: -)

0 голосов
/ 14 марта 2012

next() метод ResultSet подобен hasNext() итератора. Большинство других методов ResultSet вместо одиночного next() метода Iterator.

Я бы задал другой вопрос: почему они не сделали ResultSet реализующим итератор или, по крайней мере, итерируемым с обобщениями? Я думаю, что ответ заключается в том, что ResultSet появляется в Java до итератора. Вскоре после этого появилось много ORM-подобных инструментов, поэтому большинство людей просто не используют JDBC напрямую и не работают с ResultSet.

Но я не историк JDK, так что это мое предположение.

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