2014-06-17 8 views
5

In Java 1.8 müssen Sie kein Feld als final definieren, um es von anonymen Klassen zu beziehen.Anonyme Klassen Feldzugriff auf Java 1.8 Kompatibilität mit älteren Versionen

Zum Beispiel auf ältere Versionen:

public void foo(final int bar) { 
    new Runnable() { 
    public void run() { 
     System.out.println(bar); 
    } 
    }; 
} 

Aber jetzt, auf Java 1.8, bar muss nicht endgültig sein:

public void foo(int bar) { 
    new Runnable() { 
    public void run() { 
     System.out.println(bar); 
    } 
    }; 
} 

Also, wenn ich mein Projekt zu kompilieren, und Die einzige auf Java 1.8 implementierte Ressource, die ich verwende, ist dies (ich verwende keine Lambdas, neue Klassen usw.), wird mein Code auf Computern mit älteren Java-Versionen ausführbar sein? Wenn nicht, warum?

+3

Sie können diese [Differenz zwischen End- und effektiv final] verpasst (http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final) –

+2

'javac' erlaubt Ihnen einfach nicht,' -source 1.8' mit '-target 1.7' zu kombinieren. – Holger

+0

Ich gehe von der Tangente weg, aber ich möchte nicht in 1.8 codieren, ohne explizit meine letzten Argumente oder Variablen als * final * zu deklarieren. Im Gegensatz zu anderen Sprachen, in denen args und vars standardmäßig unveränderlich sind, hat Java, die Sprache, sie standardmäßig immer änderbar gemacht. Nun macht Java 1.8 diese Magie hinter den Kulissen, die die Grenzen dessen, was veränderbar ist und was nicht, verwischt. Schreckliche Idee, wenn es um die Codelesbarkeit geht. –

Antwort

6

laufen kann, wenn mit -target 1.8 Kompilieren javac gibt Klassendateien mit einer Versionsnummer von 52.0 aus, die von früheren JVMs nicht unterstützt wird. Selbst wenn dies der einzige Unterschied ist, verhindert es die Ausführung von Dateien, die mit -target 1.8 kompiliert wurden.

Und javac unterstützt die gleichzeitige Angabe von -source 1.8 und -target 1.7 nicht. Es wird die Fehlermeldung source release 1.8 requires target release 1.8 erzeugt.

In der Tat, wenn Sie effektiv letzte Variablen verwenden, ist die einzige Java 8-Funktion, die Sie verwenden, gibt es keine Byte-Code-Unterschied neben der Versionsnummer. Wenn Sie einen solchen Code mit dem Targeting 1.8 kompilieren und die Klassendateien mit der Versionsnummer auf 51.0 patchen, werden sie auf Java 7 ausgeführt. Es ist so einfach, das Byte bei Index 7 um eins zu reduzieren.

Der schwierige Teil ist, sich selbst zu disziplinieren, um nicht andere Java-8-Funktionen zu verwenden, wenn eine Java-8-Compiler verwenden, wenn Sie Java 7 kompatiblen Code erstellen möchten ...

1

Ich glaube, Java 8 hat die Hauptversion der Klassendatei anders als Java 7 geändert, so dass eine ältere JVM wahrscheinlich nicht in der Lage sein wird, die neueren Klassen zu laden.

Wenn Sie mit einem -target 1.7 kompilieren, ich weiß nicht, ob Sie effektiv

0

final verwenden können, wenn Sie diesen Code ohne -target 1.7 -source 1.7 kompilieren auf neuere Bytecode-Version und alte JVM laufen konnte nicht so zusammengestellt werden Klassen.

Wenn Sie kompilieren Ihr Beispiel mit -target 1.7 -source 1.7 Optionen - Komplikation mit Meldung fehlschlagen wird

error: local variable bar is accessed from within inner class; needs to be declared final 
           System.out.println(bar); 
               ^

so, Antwort ist nein, Sie nicht einen solchen Code auf älteren JVM

Verwandte Themen