kostenloser Webspace werbefrei: lima-city


Zugriffsmodifikator final

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    albert92

    albert92 hat kostenlosen Webspace.

    Ich lese nur positives über den Zugriffsmodifikatoren final. In einem Artikel habe ich gelesen, dass es die Performenz des Programms beeinflussen kann, final-Objekte sollen angeblicher schneller sein. Der einzigste Nachteil, man kann den Wert von Objekten die final deklariert worden nicht mehr ändern.
    Meine Frage: Wenn final so gut ist, wieso deklariert man dann nicht jede Klasse und Methode mit final, deren Wert (gibt es das bei Klassen und Methoden überhaupt? Oo) man nicht verändern muss.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich bin derzeit dabei, Java zu lernen, habe deswegen noch nicht so viel Ahnung, aber ich denke, dass ich dir das beantworten kann. Falls es nicht stimmt, bitte nicht böse sein :wink:. Variablen, die als final deklariert sind, sind (um es mit den Worten anderer Programmiersprachen aus zu drücken) so zu sagen Konstanten. Man setzt sie überall ein, wo man sich sicher ist, dass es keinen Bedarf gibt, den Wert, der in der Variable gespeichert wird, während der Laufzeit des Programms wieder zu ändern. Damit ist man auch davor sicher, dass ein anderer Programmabschnitt den Wert plötzlich ändert. Ob das die Performance des Programms steigern kann, weiß ich nicht, einen bemerkbaren Unterschied wird es, wenn überhaupt, aber nur bei sehr großen und komplexen Programmen oder bei Programmen, die mit großen Datenmengen jonglieren, geben.

    Edit:
    albert92 schrieb:
    Wenn final so gut ist, wieso deklariert man dann nicht jede Klasse und Methode mit final, deren Wert (gibt es das bei Klassen und Methoden überhaupt? Oo) man nicht verändern muss.
    Das tut man doch.

    Beitrag zuletzt geändert: 22.8.2010 21:53:52 von drafed-map
  4. Autor dieses Themas

    albert92

    albert92 hat kostenlosen Webspace.

    Ich hab auch noch mal bisschen geforscht und herausgefunden, dass final classes nicht erweitert werden können und final voids nicht überschrieben. Der Compiler ersetzt finale Variablen durch den Wert, dadurch findet ein Aufruf der Variable nicht mehr statt. Bei großen Programmen macht sich ein Geschwindigkeitsunterscheid bemerkbar.
    Danke! :)
  5. Das tut man doch.


    Das sollte man tunlichst nicht tun, wenn man Oo programmieren will.

    final macht eigentlich nur in Zusammenhang mit static Sinn und das auch nur in seltenen Fällen, in denen man Sicher ist, dass die Klasse niemals erweitert werden soll. Aber genau das ist ja Objekt orientiere Programmierung.
  6. wiseblood schrieb:
    Das tut man doch.


    Das sollte man tunlichst nicht tun, wenn man Oo programmieren will.

    final macht eigentlich nur in Zusammenhang mit static Sinn und das auch nur in seltenen Fällen, in denen man Sicher ist, dass die Klasse niemals erweitert werden soll. Aber genau das ist ja Objekt orientiere Programmierung.


    Also ich programmiere schon seit einer Weile in Java und ich nutze größtenteils immutable Attribute. Meistens reicht es die Werte im Konstruktor zu setzen. Dann kann man sicher sein, dass diese nicht mehr verändert werden sondern nur über getter gelesen werden. Im Zusammenhang mit static macht das nur bei Konstanten ein wenig sein. Aber da sind enums viel besser (ich liebe enums :D). Für Singleton Objekte ist das noch mit static verbindbar. Da dann einfach über einen private-Konstruktur die Instanz der Klasse erzeugen und diese über eine statische Methode aufrufen.

    Bei Methoden sollte man sowieso bevorzugt final wählen, vor allem wenn diese andere Methoden aufrufen, die so unkontrolliert ausgeführt werden. Da hat man dann ungewünschte Nebeneffekte, falls mal ein Fremder diese überschreibt.

    Finale Klassen nutze ich bevorzugt für Container-Klassen, die nur Daten beinhalten und keinerlei erweiterte Funktionen bieten sollen.

    Beitrag zuletzt geändert: 13.9.2010 12:49:53 von schaedlich
  7. Grundsätzlich lässt sich bei jeder Programmiersprache sagen, dass Zusatzinformationen wie static oder final dem Compiler helfen zu verstehen, wie der Code zu nutzen ist. Ein Compiler ist auch nur ein dummes Stück Software und er sollte auch nicht aus Eigeninitiative Code optimieren, wenn nicht sicher ist, unter welchen Bedingungen Code ausgeführt wird. Denn ansonsten hätte man böse Bugs, die vom Compiler eingebaut werden.

    Im Falle vom GNU Compiler (für C/C++ und einige andere Sprachen) muss man auch aufpassen, welche Kommandozeilenoptionen man mit übergibt. Einige dieser Optionen können auch dazu führen, dass der Compiler Optimierungen durchführt, wo dies gefährliche Konsequenzen hat.

    Beitrag zuletzt geändert: 13.9.2010 15:43:16 von bladehunter
  8. ...nun,
    das Schlüsselwort "final" hat je nach Kontext unterschiedliche Bedeutungen:
    Variable: können einmal gesetzt und dann nicht verändert werden
    Methoden: können nicht überschrieben werden
    Klassen: können nicht beerbt werden.
  9. Variable: können einmal gesetzt und dann nicht verändert werden

    Eben! Das macht nur bei Konstanten Sinn. Ansonsten wird nach meiner Meinung private deklariert und dann mit Gettern und Settern gearbeitet, die u.U. Threadsafe gemacht werden müssen.

    Methoden: können nicht überschrieben werden
    Klassen: können nicht beerbt werden.


    ... Was sie wesentlichen Bestandteile von objektorientiertem Programmieren sind. ;-)
  10. wiseblood schrieb:
    Variable: können einmal gesetzt und dann nicht verändert werden

    Eben! Das macht nur bei Konstanten Sinn. Ansonsten wird nach meiner Meinung private deklariert und dann mit Gettern und Settern gearbeitet, die u.U. Threadsafe gemacht werden müssen.

    Wie hier bereits geschrieben wurde: Zum Einen eröffnet "final" dem Compiler die Möglichkeit, zu optimieren und z.B. Ergebnisse von Berechnungen zwischenzuspeichern, zum Anderen kann es durchaus helfen, den Code sauber und klar strukturiert zu halten (wenn ich eine "final" Variable habe, kann ich mir eben sicher sein, dass der Wert niemals überschrieben wird).
    Der Haupteinsatzzweck mögen vielleicht Konstanten sein, aber es finden sich sicher auch anderweitig sinnvolle Einsatzmöglichkeiten ;)


    Methoden: können nicht überschrieben werden
    Klassen: können nicht beerbt werden.


    ... Was sie wesentlichen Bestandteile von objektorientiertem Programmieren sind. ;-)

    Hier ist "final" vor allem sinnvoll, um wichtige Funktionalität sicherzustellen - unser Standardbeispiel damals war eine Verschlüsselungsklasse, bei der man natürlich nicht möchte, dass die irgendjemand beerbt und auf diese Weise vielleicht die Verschlüsselung aushebelt ;)
    Grundsätzlich stimme ich dir hier zu, dass nicht wild alle möglichen Klassen als "final" deklariert werden sollten (wie oft habe ich mich schon über Frameworks geärgert, bei denen ich komplette Klassen selbst nachprogrammieren durfte...).
  11. Variablen, die als final deklariert sind, sind (um es mit den Worten anderer Programmiersprachen aus zu drücken) so zu sagen Konstanten.
    Das stimmt nicht, final bedeutet bei Variablen zwar, dass sie nur ein einziges mal gesetzt werden dürfen, da aber bis auf die primitive types (int, float, boolean, ...) Variablen keine Objekte "enthalten", sondern Referenzen zu Objekten, die selbst veränderlich sein können, folgt, dasss mit final deklarierte Variablen im Allgemeinen keine Konstanten sind.
    Der Compiler ersetzt finale Variablen durch den Wert, dadurch findet ein Aufruf der Variable nicht mehr statt. Bei großen Programmen macht sich ein Geschwindigkeitsunterscheid bemerkbar.
    wie gesagt, das ist so nicht richtig.
    Eben! Das macht nur bei Konstanten Sinn. Ansonsten wird nach meiner Meinung private deklariert und dann mit Gettern und Settern gearbeitet, die u.U. Threadsafe gemacht werden müssen.
    final bei Variablen (vom Objekt-Typ, nicht vom primitive type sind) macht Sinn, wenn die Variable immer auf das gleiche Objekt "zeigen" soll.
    Und bei primitive types, wenn sich der Wert nach der ersten Definition nicht mehr ändern soll.

    Der Wert muss dazu nicht schon bei der Kompilierung bekannt sein, sondern kann auch erst zur Laufzeit festgelegt werden. So etwas ist z. B. korrekter, kompilierbarer und lauffähiger Code:
    final int a = (int)(Math.random()*10);
    static final int b = (int)(Math.random()*10);



    Beitrag zuletzt geändert: 27.11.2010 19:23:49 von utgard
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!