2009-08-11 22 views
9

Tengo entendido que para mantener la compatibilidad de fuentes, Java nunca introduce nuevos métodos a las interfaces públicas, ya que eso rompe los clientes existentes que implementan las interfaces. Java Release notes estadosCompatibilidad con versiones anteriores de Java 6 Source y SQL

En general, la política es el siguiente, excepto por posibles incompatibilidades enumeradas más adelante:

  • versiones de mantenimiento (tales como 1.4.1, 1.4.2 ) no lo hacen introducir cualquier nueva característica de idioma o API. Contendrán compatibilidad de origen con entre sí.

  • comunicados de funcionalidad y principales comunicados (como 1.3.0, 1.4.0, 5.0) mantienen hacia arriba, pero no hacia abajo fuente-compatibilidad.

Sin embargo, los paquetes java.sql y javax.sql siguen evolucionando e introducir muchos cambios incompatibles. Por ejemplo, he notado los siguientes cambios incompatibles (introducidas en Java 6):

¿Sabes cómo y por qué se agregaron estos métodos? ¿Se trata java.sql de manera diferente al resto de la plataforma? ¿Conoces la discusión/JSR sobre estas adiciones?

+0

Agregar métodos no interrumpe la compatibilidad hacia arriba, solo hacia abajo (lo cual está permitido para versiones principales, como Java 6). –

+0

Pero los tipos 'java.sql' son interfaces, no clases. –

Respuesta

9

Me dio la siguiente respuesta de un desarrollador Sun

La política de la evolución general de las API en el JDK para versiones de funciones como JDK 7 es

  1. No rompa la compatibilidad binaria (como se define en el capítulo JLSv3 13)
  2. Evitar la fuente de introducción de incompatibilidades
  3. gestionar el cambio de comportamiento de compatibilidad

(Para más, mucho más de lo que le gustaría leer en diferentes tipos de compatibilidad ver

"Kinds of Compatibility: Source, Binary, and Behavioral" y "Compatibly Evolving BigDecimal"

Adición de métodos de las interfaces es binario compatible pero fuente incompatibles , por lo que no se hace comúnmente. En general, cuanto más ampliamente implementada es una interfaz, es menos probable que agreguemos métodos. El área de JDBC es una excepción a esta política y usa reglas de actualización más flexibles, pero eso causa problemas reales cuando las personas desean actualizar a una nueva versión de JDK.

+1

¿Debería ser "no * causa * problemas reales"? – nafg

1

Probablemente asumen que los proveedores de controladores de bases de datos que implementan esos métodos se mantienen actualizados con los nuevos tiempos de ejecución de Java, y que es mejor introducir nuevos métodos útiles y romper temporalmente la compatibilidad.

Por supuesto, que podría haber diseñado mejor manera que romper la compatibilidad no sería necesario ...

4

Tenga en cuenta que la adición de nuevos métodos sólo rompen la compatibilidad fuente, las implementaciones ya compilados de Statement o ResultSet en un controlador JDBC se continuar corriendo en un JDK más nuevo. Solo cuando intentes llamar a un nuevo método obtendrás un NoSuchMethodError.

+0

Correcto. ¡Es por eso que restringí la pregunta a la compatibilidad de fuentes! – notnoop

+1

Esto no es correcto. Se rompen todos los controladores implementados para Java 5. Consulte mi pregunta http://stackoverflow.com/questions/1238252/how-to-make-jdbc-driver-work-in-java-5-6 –

+1

@Zhang el problema en el la pregunta a la que se hace referencia es acerca de la compatibilidad descendente binaria; es decir, utilizando Java 6 JDK mientras se dirige a Java 5 JDK. ¡Java nunca prometió eso! – notnoop

1

Sun nunca garantiza la compatibilidad de origen entre versiones, solo compatibilidad binaria. El ejemplo más común es que el código fuente que contiene los identificadores 'assert' o 'enum' no se compilará bajo JDK 1.4 (para assert) o 1.5+ (para enum), pero los archivos .class existentes seguirán ejecutándose bajo esas JVM más recientes.

Puede intentar usar el indicador de fuente para compilar archivos .java más antiguos bajo las JVM más nuevas, pero aún puede tener problemas si confía en las clases de jvm que han cambiado.

+0

No del todo cierto. Adjunté la política para la compatibilidad de la fuente en la pregunta. Son más indulgentes con la compatibilidad de fuente de ruptura que la compatibilidad binaria; pero generalmente documentan estos cambios. Los cambios 'java.sql' no están documentados en las notas de la versión. – notnoop

Cuestiones relacionadas