Обратная совместимость Java 6 Source и SQL
-
12-09-2019 - |
Вопрос
Насколько я понимаю, для обеспечения совместимости исходного кода Java никогда не вводит новые методы в общедоступные интерфейсы, поскольку это нарушает работу существующих клиентов, реализующих эти интерфейсы. Примечания к выпуску Java состояния
В целом, политика заключается в следующем, за исключением любых несовместимости, перечисленных далее ниже:
Выпуски технического обслуживания (такие как 1.4.1, 1.4.2) не вводят никаких новых языковых функций или API.Они будут поддерживать совместимость источника друг с другом.
Выпуски функциональности и основные выбросы (такие как 1.3.0, 1.4.0, 5.0) поддерживают вверх, но не вниз по совместимости источника.
Тем не менее, пакеты java.sql
и javax.sql
продолжают развиваться и вносить множество несовместимых изменений.Например, я заметил следующие несовместимые изменения (представленные в Java 6):
java.sql.Statement
простираетсяjava.sql.Wrapper
, требующие новых двух новых методов.java.sql.Statement
представляет 3 новых методаjava.sql.PreparedStatement
представляет 19 новых методов!java.sql.ResultSet
представляет 48 новых методов!
Знаете ли вы, как и почему были добавлены эти методы?Является java.sql
к вам относятся иначе, чем к остальной платформе?Знаете ли вы о дискуссии/JSR вокруг этих дополнений?
Решение
Я получил следующий ответ от разработчика Sun
Общая политика развития API в JDK для таких выпусков функций, как JDK 7, следующая:
- Не нарушайте двоичную совместимость (как определено в главе 13 JLSv3).
- Избегайте несовместимости источников
- Управляйте изменением поведенческой совместимости
(Более подробную информацию о различных видах совместимости, чем вы хотели бы прочитать, см.
«Виды совместимости:Источник, двоичный и поведенческий"и«Совместимо развивающееся BigDecimal»
Добавление методов к интерфейсам является двоичным. совместимый но источник несовместимы, поэтому это обычно не делается.Как правило, чем более широко реализован интерфейс, тем меньше вероятность, что мы добавим к нему методы.Область JDBC является исключением из этой политики и использует более мягкие правила обновления, но это действительно вызывает реальные проблемы, когда люди хотят перейти на новую версию JDK.
Другие советы
Обратите внимание, что добавление новых методов только нарушает совместимость исходного кода, уже скомпилированные реализации Statement
или ResultSet
в драйвере JDBC продолжит работать на более новой версии JDK.Только когда вы попытаетесь вызвать новый метод, вы получите NoSuchMethodError
.
Они, вероятно, предполагают, что поставщики драйверов баз данных, реализующие эти методы, постоянно обновляют новые среды выполнения Java и что лучше ввести новые полезные методы и временно нарушить совместимость.
Конечно, они могли бы спроектировать его лучше, чтобы не было необходимости нарушать совместимость…
Sun никогда не гарантирует совместимость исходного кода между выпусками, а только двоичную совместимость.Наиболее распространенным примером является то, что исходный код, содержащий идентификаторы «assert» или «enum», не будет компилироваться в JDK 1.4 (для утверждения) или 1.5+ (для перечисления), но существующие файлы .class по-прежнему будут работать под этими новыми JVM.
Вы можете попробовать использовать флаг -source для компиляции старых файлов .java в новых JVM, но вы все равно можете столкнуться с проблемами, если полагаетесь на измененные классы jvm.