9.6 Zugriff auf lokale Variablen aus lokalen und anonymen Klassen *
Lokale und anonyme Klassen können auf die lokalen Variablen und Parameter der umschließenden Methode lesend zugreifen, jedoch nur dann, wenn die Variable final ist. Verändern können lokale und innere Klassen diese Variablen natürlich nicht, denn final verbietet einen zweiten Schreibzugriff.
Ist eine Veränderung nötig, ist ein Trick möglich. Zwei Lösungen bieten sich an:
die Nutzung eines finalen Arrays der Länge 1, das das Ergebnis aufnehmen kann
die Nutzung von AtomicXXX-Klassen aus dem java.util.concurrent.atomic-Paket, die ein primitives Element oder eine Referenz aufnehmen
Ein Beispiel:
public static void main( String[] args ) {
final int[] result1 = { 0 };
final String[] result2 = { null };
final AtomicInteger result3 = new AtomicInteger();
final AtomicReference<String> result4 = new AtomicReference<>();
System.out.println( result1[0] ); // 0
System.out.println( result2[0] ); // null
System.out.println( result3.get() ); // 0
System.out.println( result4.get() ); // null
new Object() {{
result1[0] = 1;
result2[0] = "Der Herr der Felder";
result3.set( 1 );
result4.set( "Wurstwasser-Wette" );
}};
System.out.println( result1[0] ); // 1
System.out.println( result2[0] ); // Der Herr der Felder
System.out.println( result3.get() ); // 1
System.out.println( result4.get() ); // Wurstwasser-Wette
}
Die AtomicXXX-Klassen haben eigentlich die Aufgabe, Schreib- und Veränderungsoperationen atomar durchzuführen, können jedoch in diesem Szenario hilfreich sein.