Что действительно возвращается при использовании ResultSet в JDBC? - PullRequest
1 голос
/ 10 сентября 2009

Следующий псевдокод работает, что, вероятно, никого не удивит, если бы кто-нибудь работал с JDBC:

ResultSet rs = foo.executeQuery();
boolean hasNext = rs.next();
while(hasNext) {
    bar();
    boolean hasNext = rs.next();
}

ResultSet ( java.sql.ResultSet ) является интерфейсом, поэтому для next () не должно быть реализации, только объявление метода. Так как же код работает успешно? Лучший ответ, который я нашел в Интернете, это то, что возвращается экземпляр класса, который реализует интерфейс ResultSet.

Этот ответ имеет смысл для меня (он подтверждает то, что я предполагал до того, как я на самом деле его искал), но это только приводит к другому вопросу: откуда вы знаете, какой класс вы возвращаете? Разве это теоретически не может быть чем-то, что отвергает метод интерфейса неожиданным или нежелательным образом?

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Во время выполнения ваша JVM знает, какой класс возвращается. Вы даже можете получить к нему доступ самостоятельно, используя ключевое слово java instanceof .

Вполне возможно, что вы получите что-то, что отвергает этот метод нежелательным образом. Но сигнатура метода всегда одна и та же, и только во время выполнения будут появляться проблемы с приведением классов. В этом весь смысл наследования в языке ООП, таком как Java.

Подробнее здесь .

1 голос
/ 27 сентября 2010

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

ResultSet rs = conn.executeQuery();
while (rs.next()) {
   bar();
}

Это приводит к более чистому / короткому коду, вместо того, чтобы использовать временную логическую переменную.

Что касается более заметки, вы, как правило, можете доверять тому, чтобы интерфейсы были реализованы правильно, если вы используете разработчики с «фирменным знаком» (в данном случае Oracle, MySQL, Microsoft и т. Д.) Из-за подробной документации, больших сообществ пользователей и т. Д. Как и в продуктовом магазине, используйте только непатентованные продукты, если вы можете подтвердить, что происходящее внутри такое же, как вы ожидаете от торговых марок.

1 голос
/ 10 сентября 2009

То, что вы получаете, это класс, который реализует эти интерфейсы и находится в вашем драйвере базы данных.

Например, если вы подключаетесь к MySQL, вы можете использовать драйверы от здесь .

Драйвер реализует эти интерфейсы. Он не реализует интерфейсы неожиданным или нежелательным образом, если вы получаете их от поставщиков баз данных (конечно, существуют различия в реализации между поставщиками, но это не должно быть чем-то значительным; например, я сегодня обгорел при использовании DatabaseMetaData.getSQLStateType(). должен вернуть 1 или 2, но моя реализация драйвера решила вернуть 0, но со всем остальным у меня проблем не было).

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