2012-03-14 5 views
5

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

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

+0

Я пробовал что-то вроде этого while ((o = itr.next())! = Null), я получил NoSuchElementException. Если вы видите реализацию метода iterator next() в разных классах, вы увидите, что исключение NoSuchELementException выбрано путем проверки другого состояния. Например, у Abstractlist есть прекрасный блок catchOptOutOfBoundsException, чтобы вызывать NoSuchElementException и в классе LinkedBlockingDeque следующее: = null check – Delta

ответ

8

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

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

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

0

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

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

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

+0

Кроме того, Iterable.next возвращает одно значение, а после выполнения ResultSet.next вы можете сделать много getXXX для извлечения многих значения. Я полагаю, что ResultSet мог быть реализован как Iterator, который возвращает объект «Запись», а затем вытягивает поля из записи. Полагаю, это было бы более последовательным. – Jay

+1

Это правда, что ResultSet был на Java до Iterator, но Java имеет Enumeration с версии 1.0, которая является предшественником Iterator и может быть использована, если они захотят это сделать. – Jay

+0

@ Джей, ваше предложение о записи - это именно то, что я имею в виду. – AlexR

2

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

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

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

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

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

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

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

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

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

Это, похоже, ничего не дает.

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

+0

Ну есть разница. ResultSet не делает что-то вроде первого getRecord, а затем делает getXXX на объекте записи. Он перемещает курсор на следующий объект в одном выражении и вы получаете доступ к членам этого объекта методами getXXX(). Фактически вы не получаете весь объект записи методами getXXX. – Delta

+0

@ Delta Абсолютно верно. Но использование все равно будет похоже. – Jay

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