Wie ich bereits erwähnt habe , auch in seiner Wie und wann APIs zu verwerfen sind , wird nichts über eine Richtlinie bezüglich der tatsächlichen Entfernung der veralteten APIs gesagt. ..
Die Anzahl der Anwendungen, die auf älteren JVM basieren (z. B. 1.4), ist immer noch wichtig, teilweise aufgrund von Anwendungsservern , die lange Zeit benötigen, um sich mit neuen Versionen von JVM ... zu validieren / p>
Die schiere Anzahl der Anwendungen, die tatsächlich in der Produktion laufen, bedeutet, dass diese "Rückwärtskompatibilität" -Richtlinie nicht in absehbarer Zeit gebrochen werden kann.
Es gibt verschiedene Arten von Abwärtskompatibilität:
Kann alter Quellcode mit dem neuen Compiler kompiliert werden?
Dies kann mit Werkzeugen gehandhabt werden, die alte Konstrukte in neue umwandeln, oder mit etwas wie einer "Quelle 1.6;" Anweisung am Anfang der Datei.
Können alte Klassendateien in einer neuen JVM ausgeführt werden?
In meiner Welt ist das ein kompletter Show-Stopper. Wir verwenden so viele Bibliotheken von Drittanbietern, dass es zu kostspielig wäre, alle gleichzeitig zu aktualisieren.
Dies ist auch der Treiber dafür, veraltete Klassen und Methoden nicht zu entfernen, aber in geringerem Maße.
Können alte Klassen-Dateien Code aufrufen, der mit dem neuen Compiler kompiliert wurde?
Dies ist ein wichtiger Teil von # 2 aufgrund von Rückrufen.
Kann neu kompilierter Code Code aus alten Klassendateien aufrufen?
Ein weiterer wichtiger Teil von # 2.
Sieht der Code im Wesentlichen ähnlich aus wie Entwickler?
Dies ist wichtig für das Training und für das Arbeiten mit großen Codebasen, die nicht vollständig konvertiert wurden. Ein subtilerer Aspekt ist, wie viel von der neuen Funktion in einer gemischten Codebasis verwendet werden kann. Wenn du das zu weit brichst, hast du etwas wie Scala anstelle von Java ++.
Generics wurden so hinzugefügt, dass alle dieser Kompatibilitätsarten erhalten bleiben. Ich denke, dass jede inkompatible Änderung zu Java mindestens 2, 3 und 4 erhalten muss, um eine Chance auf Akzeptanz als Java zu haben. Tools für # 1 sind ebenfalls eine Mindestanforderung.
Sie können dies mit Hobby (Ruby), niedrigen Implementierungssprachen (Python) machen, aber Sie können sich nicht vorstellen, wie viele Apps in der ganzen Welt in Java geschrieben sind. Überprüfen Sie einfach Freshmeat oder Sourceforge. Und das ist nur eine Portion. Also nein, das ist keine gute Idee. Eigentlich wäre es eine ziemlich dumme Idee.
Es gibt nicht zwei GUI-Frameworks. Swing hängt davon ab und verwendet AWT als Basis.
Ich würde es wirklich genießen, wenn bestimmte veraltete Features entfernt würden - zum Beispiel, wenn das Objekt Date
wirklich unveränderlich gemacht würde, wäre ich sehr glücklich. Wenn Sie also eine unveränderliche Klasse schreiben, können Sie nicht davon ausgehen, dass Datumsangaben unveränderlich sind und sie zum Beispiel defensiv kopieren müssen, und Sie können sie nicht zuverlässig als Schlüssel in Hashmaps verwenden (da in beiden Fällen anderer Code verwendet wird) kann das Datum mutieren, unabhängig davon, ob die Methoden als veraltet markiert sind oder nicht).
Wenn es darum geht, neue Sprachfeatures hinzuzufügen, verstehe ich das Rückwärtskompatibilitätsmantra nicht ganz. Meiner Meinung nach ist es kein großer Deal, wenn Code, der für eine frühere Version geschrieben wurde, einige Verbesserungen benötigt, um in einer späteren Version ausgeführt zu werden. Tatsächlich gibt es dafür einen Präzedenzfall; Zwischen 1.5 und 1.6 wurden der ResultSet-Schnittstelle zusätzliche Methoden hinzugefügt, sodass Code, der unter Java 1.5 kompiliert und ausgeführt würde, nicht einmal unter 1.6 kompiliert würde.
Wenn Sie alte Apps in Betracht ziehen, ist es vernünftig zu erwarten, dass eine Anwendung, die seit 5 Jahren nicht mehr aktualisiert wurde, auf der neuesten Version der JVM einwandfrei funktioniert? Wenn Unternehmen immer noch Java 1.4 und Anwendungen verwenden, die für sie geschrieben wurden, ist es ihnen wirklich wichtig, was in Java 7 steckt? Die Abwärtskompatibilität bedeutet nicht, dass alle früheren Versionen von JVMs ebenfalls beschädigt werden. Wenn die App auf eine frühere Version abzielt, kann sie problemlos auf dieser Version der JVM ausgeführt werden.
Am wichtigsten ist jedoch, dass mit der Zeit, in der die Leute Java benutzen, Fehler und Feature-Lücken offensichtlich werden, und das Korrigieren / Implementieren dieser Probleme wäre ein großer Segen. Bei der Versuchung, die Sprache zu verbessern, wegen dem, was vorher kam, wenn unglücklich, und aus meiner Sicht nicht eine grundlegende Voraussetzung, gerade Jacke sein.
Natürlich müsste man sich Gedanken über den Upgrade-Pfad machen. Plötzliche Änderungen von Inte zu Integer würden zum Beispiel eine Menge langweiliger Codeänderungen für alle erfordern (sowie das Hinzufügen zusätzlicher Null-Checks usw.). Das Hinzufügen eines neuen Features, bei dem die Abwärtskompatibilität aufgehoben wird (z. B. bei Schließungen), oder das Entfernen von Methoden, die seit Jahren nicht mehr unterstützt werden, hat jedoch kaum Auswirkungen auf den vorhandenen Code. (Wenn Sie veraltete Methoden verwendet haben, dann sollten Sie sie zuvor entfernt haben, aber jetzt müssen Sie es tun!)
Aus Kompatibilitätsgründen können sie dies nicht mit den Standard-Java-Versionen tun. Es gibt so viel Java-Software in der Produktion, dass Sie es einfach nicht mit einer neuen Version brechen können, die den ganzen Kram entfernt.
Ich denke jedoch, dass Sun eine "Java X" -Version erstellen könnte, die alles entfernt, was schwierig war, und alle guten und nützlichen APIs hinzugefügt hat, die derzeit nicht enthalten sind (einschließlich Java-APIs, die bessere Alternativen bieten) zB log4j, und lassen Sie uns nicht am Datum und Kalender beginnen). Diese Version soll Java nicht ersetzen, könnte aber als Ziel für neue Softwareprojekte dienen. Ich schätze, sie könnten auch die Sprache reparieren, um fehlende Features einzubinden, die Java im Vergleich zu den neuesten Versionen von C # etc. ein wenig widerspenstig machen. Wenn sie auch ein Code-Portierungstool erstellen, das es reparieren oder zumindest ergänzen könnte "FIXME" zu allen Problembereichen in einer Codebasis ...
Ich muss zugeben, Microsoft macht gute Arbeit, wenn es darum geht, Leute auf neuere Versionen von .NET zu bringen, wenn sie herauskommen. Sun ist hier völlig gescheitert, angesichts der Anzahl der Anwendungen, die immer noch auf 1.4 laufen, und der lethargischen Java-Versionspolitik vieler Firmen (die anscheinend froh sind, dass ihre .NET-Leute das Neueste und Beste irgendwie verwenden). Angesichts der Tatsache, dass es einfach ist, mehrere Java-Installationen auf einer Maschine zu haben, sollte meiner Meinung nach mehr getan werden, um Unternehmen und Softwarehäuser zu einem schnelleren Upgrade zu ermutigen.
Ich würde sagen, die Kompatibilität mit Rückwärtskompatibilität ist eine dumme Sache für Java. Wenn ja, können Sie es Java ++ nennen, es ist nicht mehr Java. Auf der anderen Seite sollte es für zukünftige Java-Versionen von der dynamischen Sprache für Funktionen wie Syntax-Einfachheit lernen. Da die Leistung der Hardware so schnell ansteigt, sollte das abstrakte Niveau für eine kompilierende Sprache höher sein. Vergleicht man einige Features der aktuellen Java-Versionen mit dynamischen Sprachen, ist es zu ungeschickt und ausführlich und daher für die Entwicklung weniger produktiv. Es scheint, C # wird zu einer dynamischen Sprache?
Mit vielen großartigen alternativen Sprachen auf der JVM sehe ich wirklich keinen Grund, warum. Ich würde lieber ein stabiles Java haben und für die coolen neuen Sachen weitermachen (und immer noch mit Java kompatibel bleiben).
Wie Pat sagte, ist die Einführung der neuesten JDK-Version ziemlich langsam, und viele Anwendungen laufen derzeit mit alten (manchmal wirklich alten) Versionen von Java.
Daher glaube ich nicht, dass es einen wirklichen Vorteil hat, die Abwärtskompatibilität nicht zu gewährleisten.
Für Ihre Vorschläge sehe ich nicht wirklich das Interesse, die Primitiven zu entfernen. Natürlich gibt es Autoboxing seit Java 5. Primitive haben aber immer noch ihre Interessen ...
Die Brechenkompatibilität würde Sinn machen, wenn die JVM dasselbe behält. In diesem Fall würde das "neue" Java eine neue, andere Sprache werden, die auf der JVM läuft, wie die dort dort . Glücklicherweise garantiert die Art und Weise, wie die JVM konzipiert ist, die Interoperabilität zwischen Sprachen und Versionen, daher denke ich, dass die Auswirkungen begrenzt sein würden.
Ich denke, eine Gabelung wäre angemessener, um der Sprache eine gründliche Überarbeitung zu geben. Die Art und Weise, wie Javas Generika funktionieren, beginnt mich ehrlich zu ärgern.
Der Grund, warum ich PHP verlassen habe, ist, dass sie die API / verfügbaren Funktionen zwischen Hauptversionsupgrades ändern. Das eigentliche Problem ist, dass PHP für ältere Skripte nicht im Kompatibilitätsmodus ausgeführt werden kann. Ich möchte nicht gezögert werden, meinen Code zu aktualisieren.
Java ist an der gleichen Stelle. Stellen Sie nur sicher, dass Sie die alten 1.4 Sachen auf den neuen Versionen verwenden können. Es ist in Ordnung, neue Programme zu verlangen, um ein neues xyntax zu verwenden, aber das alte Zeug laufen zu lassen!
Was die Grundelemente betrifft, werden sie immer da sein, ob sie es sind oder nicht, weil sie die Grundbausteine von Objekten sind. Sicher, Sie könnten stattdessen die Wrapper-Klassen verwenden, aber das übersteuert nur den Compiler, der in den meisten Fällen schließlich in Primitive zurückübersetzt wird.
Die Rückwärtskompatibilität ist sehr wichtig, und wie bereits erwähnt, gibt es immer noch viele Benutzer, die 1.3 und 1.4 Code ausführen. Nachdem ich dies gesagt habe, denke ich, dass jemand, der immer noch Java 1.0 oder 1.1 Code in einem Legacy-System verwendet, wahrscheinlich nicht bald auf Java 7 migrieren wird, und selbst wenn sie dies tun, werden sie höchstwahrscheinlich ihre neu schreiben müssen Code sowieso. Ich denke, die veraltete API der Versionen & gt; 1.2 kann sicher entfernt werden.
Ein weiterer Aspekt der Abwärtskompatibilität ist die Hinzufügung von Schlüsselwörtern, von der immer abgeraten wird. In Java 5 wurden die wichtigsten Änderungen in der Sprache durch Hinzufügen eines einzigen neuen Schlüsselworts, "enum", gehandhabt, und selbst das verursachte eine Empörung, da jedes Stück Code mit einer Variablen namens enum nicht mehr konform war. Soweit ich weiß, sind die Änderungen in Java 7 ohne neue Schlüsselwörter (puh!) Geplant.
Yuval = 8 -)
Es wird gut sein, abhängig davon, dass Sun keine neuen JDK-Upgrades für alle seine Clients bereitstellt. Diejenigen, die alte APIs verwenden, werden nicht aktualisiert und verwenden für eine Weile ein JDK der alten Version.
Oder vielleicht, indem Sie den Rückwärtskompatibilitätsmodus implementieren.
Ich denke, dass einige API zum Beispiel Datum Zeit neu geschrieben werden sollte. Wenn die aktuelle Version es EOL empfängt, sollte die alte API entfernt werden. Unsere Statistik zeigt, dass 99,3% unserer Kunden Java 6 oder neuer verwenden. Es besteht keine Notwendigkeit für Kompatibilität sehr alte API. Aber es muss einen klaren Zeitrahmen geben, wenn eine API entfernt wird.
Tags und Links java language-features