Вопрос

Насколько я понимаю, для обеспечения совместимости исходного кода 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 к вам относятся иначе, чем к остальной платформе?Знаете ли вы о дискуссии/JSR вокруг этих дополнений?

Это было полезно?

Решение

Я получил следующий ответ от разработчика Sun

Общая политика развития API в JDK для таких выпусков функций, как JDK 7, следующая:

  1. Не нарушайте двоичную совместимость (как определено в главе 13 JLSv3).
  2. Избегайте несовместимости источников
  3. Управляйте изменением поведенческой совместимости

(Более подробную информацию о различных видах совместимости, чем вы хотели бы прочитать, см.

«Виды совместимости:Источник, двоичный и поведенческий"и«Совместимо развивающееся BigDecimal»

Добавление методов к интерфейсам является двоичным. совместимый но источник несовместимы, поэтому это обычно не делается.Как правило, чем более широко реализован интерфейс, тем меньше вероятность, что мы добавим к нему методы.Область JDBC является исключением из этой политики и использует более мягкие правила обновления, но это действительно вызывает реальные проблемы, когда люди хотят перейти на новую версию JDK.

Другие советы

Обратите внимание, что добавление новых методов только нарушает совместимость исходного кода, уже скомпилированные реализации Statement или ResultSet в драйвере JDBC продолжит работать на более новой версии JDK.Только когда вы попытаетесь вызвать новый метод, вы получите NoSuchMethodError.

Они, вероятно, предполагают, что поставщики драйверов баз данных, реализующие эти методы, постоянно обновляют новые среды выполнения Java и что лучше ввести новые полезные методы и временно нарушить совместимость.

Конечно, они могли бы спроектировать его лучше, чтобы не было необходимости нарушать совместимость…

Sun никогда не гарантирует совместимость исходного кода между выпусками, а только двоичную совместимость.Наиболее распространенным примером является то, что исходный код, содержащий идентификаторы «assert» или «enum», не будет компилироваться в JDK 1.4 (для утверждения) или 1.5+ (для перечисления), но существующие файлы .class по-прежнему будут работать под этими новыми JVM.

Вы можете попробовать использовать флаг -source для компиляции старых файлов .java в новых JVM, но вы все равно можете столкнуться с проблемами, если полагаетесь на измененные классы jvm.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top