Java 6 Fonte compatibilidade com versões anteriores e SQL
-
12-09-2019 - |
Pergunta
O meu entendimento é que, a fim de manter a fonte de compatibilidade, Java não introduz novos métodos para interfaces públicas, como que as quebras de clientes que implementam as interfaces existentes. notas Java versão estados
Em geral, a política é a seguinte, Exceto por eventuais incompatibilidades listados mais abaixo:
versões de manutenção (tais como 1.4.1, 1.4.2) não introduzir quaisquer novos recursos de linguagem ou APIs. Elas vão manter a fonte-compatibilidade com uns aos outros.
lançamentos funcionalidade e grande versões (tais como 1.3.0, 1.4.0, 5.0) manter para cima, mas não para baixo source-compatibilidade.
No entanto, os pacotes java.sql
e javax.sql
continuar a evoluir e apresentar muitas mudanças incompatíveis. Por exemplo, eu notei as seguintes alterações incompatíveis (introduzidas no Java 6):
-
java.sql.Statement
estendejava.sql.Wrapper
, requerendo novos dois novos métodos. -
java.sql.Statement
introduz 3 novos métodos -
java.sql.PreparedStatement
introduz 19 novos métodos ! -
java.sql.ResultSet
introduz 48 novos métodos !
Você sabe como e por que esses métodos foi acrescentado? É java.sql
ser tratado de forma diferente do resto da plataforma? Sabe da discussão / JSR em torno destas adições?
Solução
Eu tenho a seguinte resposta de um Sun Developer
A política geral de evolução para APIs do JDK para lançamentos de funcionalidades como JDK 7 é
- Não quebre a compatibilidade binária (conforme definido no capítulo JLSv3 13)
- evitar a introdução de incompatibilidades fonte
- Gerir a mudança comportamental compatibilidade
(Para mais, muito mais do que você gostaria de ler sobre os diferentes tipos de Compatibilidade ver
"Tipos de Compatibilidade: Source, binário, e Comportamental" e "compatível Evolving BigDecimal"
Adicionando métodos para interfaces é binário compatível e source incompatíveis, por isso não é comumente feito. Geralmente, quanto mais amplamente implementado uma interface é, menos provável é que para adicionar métodos para isso. A área JDBC é uma exceção a esta política e usos looser atualizar regras, mas isso causa problemas reais quando as pessoas querem atualizar para uma nova versão JDK.
Outras dicas
Note que a adição de novos métodos só quebrar a compatibilidade fonte, implementações já compilados de Statement
ou ResultSet
em um driver JDBC continuará a ser executado em um JDK mais recente. Somente quando você tentar chamar um método novo que você vai ter um NoSuchMethodError
.
Eles provavelmente assumir que fornecedores de driver de banco de dados que implementam esses métodos são manter-se atualizado com novos tempos de execução Java, e que é melhor para introduzir novos métodos úteis e temporariamente quebrar a compatibilidade.
Claro, eles poderiam ter projetado-lo melhor para que quebrar a compatibilidade não seria necessário ...
Sun nunca garante compatibilidade de origem entre os lançamentos, apenas a compatibilidade binária. O exemplo mais comum é que o código-fonte que contém 'assert' ou identificadores 'enum' não irá compilar sob JDK 1.4 (para assert) ou 1.5+ (para enum), mas arquivos existentes .class ainda será executado sob essas JVMs mais recentes.
Você pode tentar usar a bandeira -source para compilar arquivos .java mais velhos sob JVMs mais recentes, mas você ainda pode ter problemas se você está confiando em classes JVM que foram alterados.