plusone

17. November 2011

final oder nicht final - Das ist hier die Frage

Guten Abend,

an dem Tag der Philosophie widmen wir uns dem Thema vom Schlüsselwort "final".

Ihr nutzt eine Variable und dann kommt ihr auf die Idee auch Innereklassen zu implementieren. Eure IDE schlägt vor, final zur Deklaration hinzufügen, aber ihr wollt die Variable doch noch ändern.
Was nun?

Erst ma Entwarnung eure IDE spinnt nicht, sie reagiert nur auf bestimmte Ereignisse. Aber ich würde an eure Stelle gedanken machen, ob ihr wisst was eig. tun wollt.

Also generell gilt, final für primitive Datentypen und String immer hinzufügen, soweit es geht. Wollt ihr im Verlauf euren Codes den Wert der Variable verändern, dann ist klar - kein final.

Auf was muss ich noch achten?
Innereklassen ist ein gutes Beispiel. Instanziert ihr eine Innereklasse und erlaubt den direkten Zugriff auf eure Methodenvariable, muss diese final sein!
Wieso? Die Innere Klasse muss wissen, welchen Wert der Variable zugewiesen wurde. Diese Klasse arbeitet im eigenen "Sandkasten" und der Verlauf eurer Methode interessiert sie wenig, daher auch nicht, ob sich der Wert der Variable sich ändert oder ob diese Variable nicht das Ende ihres Lebenszyklus erreicht hata. Er darf sich nicht ändern und muss noch existieren, wie sollte auch die Innereklasse das mitbekommen und arbeiten können? Also final!

Aber jetzt habe ich eine Variable die sich ändert und von der instanzierte Innereklasse genutzt wird!
Tipps und Tricks gibts zu genügen.
  1. Solltet ihr die Möglichkeit haben, diese Variable bzw. den Wert per Parameter zu übergeben, dann nutzt diese Möglichkeit!
  2. Deklariert eine neue Variable, fügt final hinzu und weist auch den Wert, denn ihr brauch, zu.
  3. Dynamisch? Dann solltet ihr globale Variablen benutzen.
public class FinalTestArea {
    String first = "globaler String der geändert werden kann";

    public FinalTestArea() {
        final String second = "String der nicht geändert werden kann";
        String third = "String der geändert werden kann";

        final String fourth = third;

        new Thread(new Runnable() {

            @Override
            public void run() {
                String r = third + "neuer String"; // führt zu:
                // Cannot refer to
                // a non-final
                // variable third inside an inner class
                // defined in a different method

                /*
                 * fourth und second weisen hier das gleiche
                 *
Verhalten auf. Können aber genutzt werden
                 *
um den Wert abzufragen etc.
                 */
                second = "neuer String"; // führt zu:
                // The final local variable second cannot
                // be assigned, since it is defined in an
                // enclosing type

                /*
                 * Zugriff auf Globale Variablen geht, da diese
                 *
nach dem (in diesem Fall) Konstruktor noch
                 * "leben".
                 */
                Log.i("INFO", first);
                first = "neuer String";
            }
        });
    }
}


Also soweit klar?
Lesestoff gibts hier:
http://developer.android.com/guide/practices/design/performance.html#use_final
www.google.de/search?q=java+innere+klasse

regards
Alexander Fink

Keine Kommentare:

Kommentar veröffentlichen