Frage

Hat es zu Inkompatibilitäten gewesen zwischen Java veröffentlicht, wo Java-Quellcode / Java-Klasse-Dateien Java-Version X-Targeting wird nicht kompiliert / lief unter Version Y (wobei Y> X)?

Mit dem "Java-Release" Ich meine Versionen wie:

  • JDK 1.0 (Januar 1996)
  • JDK 1.1 (Februar 1997)
  • J2SE 1.2 (Dezember 1998)
  • J2SE 1.3 (Mai 2000)
  • J2SE 1.4 (Februar 2002)
  • J2SE 5.0 (September 2004)
  • Java SE 6 (Dezember 2006)

Hausordnung:

  • Geben Sie bitte Referenzen und Code-Beispiele, wo möglich.
  • Bitte versuchen Sie es sehr spezifisch / Beton in Ihrer Antwort zu sein.
  • Eine Klasse, die als @deprecated markiert wird zählt nicht als rückwärts Inkompatibilität.
War es hilfreich?

Lösung

Hinweise zur Kompatibilität für verschiedene Versionen:

Der erste große Schluckauf Ich erinnere mich, war die Einführung von assert in Java 1.4. es eine Menge JUnit Code betroffen.

Andere Tipps

Zu allererst Sun hält tatsächlich alle der Veröffentlichungen Sie erwähnt (außer 1.0 natürlich) sein minor Veröffentlichungen, nicht großen.

Ich bin keine Kenntnis von Beispielen von binärer Inkompatibilität in dieser Zeit. Allerdings gab es einige Beispiele für Quelle Unverträglichkeit:

  • In Java 5 "Enum" wurde ein reserviertes Wort; es war, bevor nicht. Daher gab es Quelldateien, die Enum als Kennung verwendet, die in Java kompilieren würde 1.4, die in Java 5.0 nicht kompiliert werden würde. Sie können jedoch mit -source 1.4 kompilieren, dies zu umgehen.

  • Hinzufügen von Methoden zu einer Schnittstelle als auch Quelle Kompatibilität brechen können. Wenn Sie eine Schnittstelle implementieren, und versuchen Sie dann, dass die Umsetzung mit einem JDK zu kompilieren, die neuen Methoden zur Schnittstelle fügt hinzu, wird die Quelldatei kompiliert nicht mehr erfolgreich, weil es alle Schnittstellen der Mitglieder nicht implementiert. Dies hat mit java.sql.Statement und den anderen jdbc Schnittstellen häufig passiert ist. Die kompilierten Formen dieser „ungültig“ Implementierungen wird immer noch funktionieren, wenn Sie tatsächlich eine der Methoden aufrufen, die nicht vorhanden ist; wenn Sie das tun, wird eine Missing geworfen werden.

Dies sind ein paar Beispiele, die ich kann von der Oberseite meines Kopfes erinnern ab, kann es andere sein.

Die Schnittstelle java.sql.Connection wurde von Java 1.5 auf Java 1.6 machen Kompilation aller Klassen erweitert, die diese Schnittstelle implementiert scheitern.

Jede Version von Swing-brach etwas für uns, von 1,3 bis 1,6.

Die JDBC-Ausgabe ist bereits erwähnt worden, aber vorhandene Code gearbeitet.

Von 1,5 bis 1,6 gibt es eine Änderung im Verhalten der Buchse, die den Cisco Client brachen.

Natürlich neu reservierte Schlüsselwörter eingeführt wurden.

Der große, die ich denke, auf der Sun Teil truely unverzeihlich war, war System.getenv (). Es funktionierte in 1,0, und wurde dann weiterentwickelt und veränderte einen Fehler auf allen Plattformen unter der eher fragwürdigen Begründung zu werfen, dass der Mac nicht Systemumgebungsvariablen hat. Dann wird der Mac bekam Variablen Systemumgebung, so in 1,5 sie undeprecated wurde und funktioniert. Es gibt keine vernünftige Begründung, dass zu tun. Gebe einen leeren Satz auf einem Mac (Swing hat viel größere Cross-Plattform-Probleme, wenn Sie über diese Ebene der Cross-Plattform-Konsistenz kümmern wollen) oder auch auf allen Plattformen.

Ich stimmte mit ihnen nie die Funktion ausgeschaltet, aber es ändere ein Fehler zu werfen, war nur eine reine Bruch Veränderung, wenn sie es tun wollen, sollten sie nur ganz die Methode entfernt haben.

Aber wirklich 1,0-1,1 sie waren weniger besorgt über Abwärtskompatibilität. Zum Beispiel sank sie „privat geschützt“ als Modifikator.

So das Ergebnis ist, dass jede Version ändert sich nahe genug Auswertung erforderlich ist, das ist, warum Sie immer noch viele Fragen 1.4 hier auf SO sehen.

Die wichtigste, die ich denken kann, ist die Einführung der neuen reservierten Wörtern:

Java 1.3: strictfp
Java 1.4: assert
Java 5.0: enum

Jeder Code, der zuvor diese Werte als Bezeichner verwendet würde unter einer späteren Version nicht kompiliert werden.

Ein weiteres Problem, das ich verursachen Probleme an einem Projekt erinnern, dass ich auf war gearbeitet, dass es eine Änderung in der Standard Sichtbarkeit von JInternalFrames zwischen 1,2 und 1,3 . Sie waren standardmäßig sichtbar, aber wenn wir auf 1,3 aufgerüstet sie schienen alle verschwunden zu sein.

zwischen 1,3 und 1,4 der Interpretation von Long.parseLong (String) behandeln die leere Zeichenfolge unterschiedlich. 1.3 gibt einen 0 Wert, während eine 1,4 NumberFormatException wirft.

Neukompilierungen sind nicht erforderlich, aber funktionierenden Code funktioniert nicht, wenn es auf dem 1.3 Verhalten verlassen.

Die Semantik des Speichermodell rel="nofollow < a href = "http://jcp.org/en/jsr/detail?id=133" rel = "nofollow noreferrer"> 1,4-1,5 verändert. Es wurde neben anderem doppelte Verriegelung wieder überprüft, damit geändert. (Ich glaube, flüchtige Semantik festgelegt wurde.) Es war gebrochen.

Im Folgenden wird unter Java 1.4 kompilieren, aber nicht Java 1.5 oder höher.

(Java 5 eingeführt 'Enumeration' als Schlüsselwort. Hinweis: es in Java 5 kompilieren, wenn die "-Quelle 1.4" Option zur Verfügung gestellt.)

public class Example {
    public static void main(String[] args) {
        String enum = "hello";
    }
}

Offensichtlich ist die Namenskonvention von # ist nicht rückwärtskompatibel .

  • JDK 1.0 (23. Januar 1996)
  • JDK 1.1 (19. Februar 1997)
  • J2SE 1.2 (8. Dezember 1998)
  • J2SE 1.3 (8. Mai 2000)
  • J2SE 1.4 (6. Februar 2002)
  • J2SE 5.0 (30. September 2004)
  • Java SE 6 (11. Dezember 2006)
  • Java SE 6 Update 10, Update 12, 14-Update, Update 16
  • Java SE 7 ??? JDK7?

( Die Liste von Wikipedia ist.)

Ein weiteres Beispiel für java.sql brechen Kompatibilität:

1,5 ein compareTo (Datum) Methode wurde auf java.sql.Timestamp hinzugefügt. Diese Methode würde eine Classcast werfen, wenn das gelieferte Datum keine Instanz von java.sql.Timestamp ist. Natürlich erstreckt sie java.sql.Timestamp Datum und Datum hatte bereits eine compareTo (Datum) Methode, die mit allen Daten gearbeitet, so bedeutete dies, dass Code, der einen Zeitstempel auf ein (nicht-Timestamp) Datum verglichen in 1.5 zur Laufzeit brechen .

Es ist interessant festzustellen, dass es scheint, dass 1.6 scheint dieses Problem behoben zu haben. Während die Dokumentation für java.sql.Timestamp.compareTo (Datum) immer noch sagt: „Wenn das Argument kein Timestamp Objekt ist, ist diese Methode ein ClassCastException Objekt wirft“, sagt die tatsächliche Umsetzung sonst. Meine Vermutung ist, dass dies eine Dokumentation Fehler.

Siehe auf der API-Änderungen für die JRE-Klassenbibliothek berichten hier: http: // abi-laboratory.pro/java/tracker/timeline/jre/

Der Bericht enthält rückwärts Binär- und Source-Kompatibilität Analyse von Java-Klassen.

Der Bericht wird durch die erzeugt japi-Compliance-Checker Werkzeug.

...

Eine weitere interessante Analyse für JDK 1,0-1,6 Sie unter Japitools JDK finden -Ergebnisse Seite.

Als Sean Reilly sagte, eine neue Methode, um Ihren Code brechen. Neben dem einfachen Fall, dass Sie eine neue Methode zu implementieren haben (dies wird eine Compiler-Warnung erzeugen) eine Worst-Case: eine neue Methode in der Schnittstelle hat die gleiche Signatur als Methode, die Sie bereits tun haben in deiner Klasse. Der einzige Hinweis vom Compiler ist eine Warnung, dass die @Override Anmerkung fehlt (Java 5 für Klassen, die Anmerkung für Schnittstellen in Java 6 unterstützt wird, aber optional).

Ich habe es nicht versucht, aber in der Theorie würde dies in Java 1.2 in Java 1.1 und brechen arbeiten. (Mehr info hier )

public class Test {
    float strictfp = 3.1415f;
}

Aus persönlicher Erfahrung, wir hatten einige AWT / Swing Textfelder in einem SWT_AWT Rahmen eingebettet in 1,5, die nach dem Upgrade auf 1.6 editierbare aufgehört zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top