finaler Wert in outerMethod von method in InnerMethodClass

Rau

Neues Mitglied
Hallo Forum!

Weiß jemand wie man den Wert sum = 300 abrufen kann?

Java:
public class OuterClass {
int sum = 400;

    public void outerMethod() {
         final int sum = 300; // ?????

       class InnerMethodClass {
             int sum = 200;

            public void innerMethodClassMethod() {
                int sum = 100;

                System.out.println("local variable of method within Inner class: " + sum);
                System.out.println("Inner class variable: " + this.sum);
                System.out.println("Outer class variable: " + OuterClass.this.sum);
            }
        }
        InnerMethodClass imi = new InnerMethodClass();
        imi.innerMethodClassMethod();
    }
}

Note: Local inner class cannot access non-final local variable till JDK 1.7. Since JDK 1.8, it is possible to access the non-final local variable in method local inner class.
 
Zuletzt bearbeitet:
Hier kommen aus meiner Sicht zwei Dinge zum Tragen:

a) Ja, es ist richtig, dass auf eine (quasi) final Variable zugegriffen werden kann. Dies kann man an einem einfachen Beispiel zeigen:
Java:
public class OuterClass {
    public void outerMethod() {
        final int sumX = 300;

        class InnerMethodClass {
            public void innerMethodClassMethod() {
                System.out.println("sumX: " + sumX);
            }
        }
    }
}

Wichtig ist hier, dass man das final auch wegnehmen kann. Da es außer bei der Initialisierung nicht gesetzt wird, ist es ausreichend ("effective final" ist die Bezeichnung in der JLS).
Sobald Du aber dann eine weitere Zuweisung in der Methode vornimmst, dann fängt Java an zu meckern.

b) Zugriff auf Variablen, die versteckt wurden. Die Variable sum hast Du auf verschiedenen Ebenen. Und da gibt es dann teilweise Möglichkeiten, um die Variablen dennoch anzusprechen. Für die lokale Variable gibt es meines Wissens nach aber keine Möglichkeit.

Generell ist das auch ein Zeichen für ein sehr schlechtes Design. Sowas sollte meiner Meinung nach nicht gemacht werden. (Generell wäre ich mit so inneren Klassen innerhalb einer Methode auch etwas vorsichtiger. Das ist eher unüblich und aus meiner Sicht zumindest kein guter Stil. (Mit Java 8 sind funktionale Elemente eingeführt worden und die führen zu kürzerem und übersichtlicheren Code!)
 
Vielen Dank Konrad für die schnelle Antwort.

Mir ist es nun klar geworden, dass man hier deswegen final schreibt, oder auch weg lässt,
den Wert gar nicht geändert werden darf. ;-(

Ich kann halt nur den Wert in Method bzw. InnerClass deaktivieren, um an diesen Wert
in outerMethode heranzukommen.

Nochmals vielen Dank!
 

Neue Themen


Zurück
Oben