final "spammen" + bedeutung

  • Themenstarter Gelöschtes Mitglied 65838
  • Beginndatum
G

Gelöschtes Mitglied 65838

Gast
Also ich versteh sas final bei methoden und klassen bedeutet

bei primitiven daten typen denke ich ( ? ) der wert der drin steht steht drin fertig aus

aber bei objekten komm ich nicht klar damit
Java:
public class Test {

    private final SimpleStringProperty stringProperty = new SimpleStringProperty();
void setStringProperty(String string){
this.stringProperty.set(string);
}

}
wenn ich zb diese klasse habe darf ich trotzdem dass es final ist die inneren werte noch verändern wie ich lustig bin ( ? )
also ist nur die referenz final dass ich keine neue referenz zu ordnen kann ( ? )

falls das bis jetzt so stimmt dann kann ich ja gefühlt vor fast allem final hinklatschen

zb bei javafx wenn ich im model und view die properties hab die der controller verknüpft kann ich fast IMMER diese Properties final machen
genauso wie bei allen Nodes wie z.b. Button obererButton = new Button("bob"); kann ich auch final davor schmeißen .. es geht gefühlt bei allem
 
G

Gelöschtes Mitglied 65838

Gast
dh in meinem fall kann ich gefühlt vor allen properties zb ein final ballern weil die niemals während der laufzeit neu referenziert werden zb siehts dann so aus
Java:
    private final SimpleStringProperty strengthValue = new SimpleStringProperty("STRENGTH");
    private final SimpleStringProperty healthValue = new SimpleStringProperty("HEALTH");
    private final SimpleStringProperty levelValue = new SimpleStringProperty("LEVEL");
    private final SimpleStringProperty typeValue = new SimpleStringProperty("TYPE");
    private final SimpleStringProperty artistValue = new SimpleStringProperty("ARTIST");
    private final SimpleStringProperty effectTextValue = new SimpleStringProperty();
    private final ObjectProperty<Node> pictureInfoProperty = new SimpleObjectProperty<>();
tut man das denn ?
eig gehört da statt Value property hin.. hab ich noch nich gemacht
 
K

kneitzel

Gast
So da nie eine neue Instanz zugewiesen wird, dann sollte man das auch machen.

Und es gibt Tools, die den Source Code untersuchen und einem sogar warnen, wenn Elemente final sein könnten und es nicht sind.

Und eine Sache, die bei mir immer final ist: Parameter. Das sind halt Eingaben in eine Methode oder Konstruktor und denen wird nichts zugewiesen.
 

Neumi5694

Top Contributor
final ist genau dafür da, damit verhinderst du, dass du als Benutzer einen Wert, der nicht geändert werden darf, änderst.
Außerdem müssen finale Klassenvariablen am Ende des Konstruktors einen Wert haben, auch das prüft der Compiler.

Eine final-Methode kann von einer abgeleiteten Klasse nicht überladen/überschrieben werden, hat auch seine Berechtigung.

Sobald du mal mit Lambdas zu tun hast, wirst du über "effective final" als Fehlermeldung stoßen. Das bedeutet, dass eine Variable außerhalb des Ausdrucks mehr als einmal einen Wert zugewiesen bekommen hat, was nicht erlaubt ist, wenn man sie innerhalb eines Lambda-Ausdrucks verwendet. "effective" final deshalb, weil die Variable auch nicht final sein darf, aber nur einmal einen Wert erhalten darf.

Sobald der Code nämlich einmal kompiliert ist, hat "final" (fast) keine Bedeutung mehr. Unter bestimmten Umständen wird der Wert einer primitiven final Variable zwecks Optimierung direkt in den Code als Konstante eingetragen. Zumindest war es mal so. Ich glaube, der Compiler würde das mittlerweile auch ohne das Schlüsselwort machen, wenn er erkennt, dass der Wert der Variable nur einmal gesetzt wurde.
Das Schlüsselwort ist im Bezug auf Variablen vor allem für dich als Programmierer da, um Fehler zu vermeiden.
 

White_Fox

Top Contributor
Wie so oft: Versuche, den Code mal wörtlich und mit Bedeutung zu lesen.

Wenn du z.B. eine Geschichte liest, dann läuft doch im Kopf so eine Art Film ab. Wenn eine Szenerie beschrieben wird in der eine Handlung stattfindet, bekommt man doch eine Vorstellung davon, wie es aussieht, was die Charaktere da treiben, usw.

Und genau so sollte man Quellcode lesen (und genau so sollte man Quellcode auch schreiben - siehe Signatur eines bekannten Benutzers hier). Dann wird vieles von ganz alleine klar.
 

Barista

Top Contributor
In Java ist es wirklich irreführend, dass mit dem final Modifier übergebene Objekte verändert werden können.

Das ist wirklich eine Schwäche, nicht so schlimm wie die fehlende Speicherverwaltung in C/C++, aber geht in diese Richtung.

Seiteneffekte gelten als grosse Fehlerquelle.

Man kann seine Klassen immutable machen oder nur eine read only view übergeben.

In der funktionalen Programmierung vermeidet man veränderlich Objekte.
 

White_Fox

Top Contributor
Wieso? Die Referenzvariable soll ja final sein - und das ist sie auch. Die Instanzvariablen dieses Objekts sind ja eine andere Baustelle, bzw. wäre OOP etwas witzlos wenn dieses Objekt seinen inneren Zustand nie wieder verändern dürfte.
 

mihe7

Top Contributor
Wieso? Die Referenzvariable soll ja final sein - und das ist sie auch. Die Instanzvariablen dieses Objekts sind ja eine andere Baustelle, bzw. wäre OOP etwas witzlos wenn dieses Objekt seinen inneren Zustand nie wieder verändern dürfte.
Witzlos würde ich das nicht bezeichnen, es geht ja darum, dass man über die betreffende Variable den inneren Zustand nicht ändern kann. Praktisch ein fallweises Immutable. In C++ geht das via const, in Java braucht man dafür ein Interface.
 

Neumi5694

Top Contributor
Witzlos würde ich das nicht bezeichnen, es geht ja darum, dass man über die betreffende Variable den inneren Zustand nicht ändern kann. Praktisch ein fallweises Immutable. In C++ geht das via const, in Java braucht man dafür ein Interface.
Das hat alles seine Daseinsberechtigung und ist sinnvoll. Nur ist das Ziel von "final" halt ein anderes.

Meine c++ Zeit ist schon ein paar Jährchen her, aber ich kann mich nicht daran erinnern, dass dort const für etwas anderes als primitive Datentypen verwendet wurde. Mir ist jetzt nichts bekannt, wo du sagen könntest (Pseudocode)
const Point p = new Point (3,5);
und der Versuch, per p.setX(5); oder p.x=5; eine der Koordinaten zu verändern einen Fehler auslösen würde.
Hab auch kurz gegoogelt (nicht besonders lange, muss ich zugeben) und nichts derartiges gefunden.
Hast du da was zur Hand? (nicht lang suchen, falls nicht. Ist nicht so wichtig)
 

mihe7

Top Contributor
Das hat alles seine Daseinsberechtigung und ist sinnvoll. Nur ist das Ziel von "final" halt ein anderes.

Meine c++ Zeit ist schon ein paar Jährchen her, aber ich kann mich nicht daran erinnern, dass dort const für etwas anderes als primitive Datentypen verwendet wurde. Mir ist jetzt nichts bekannt, wo du sagen könntest (Pseudocode)
const Point p = new Point (3,5);
und der Versuch, per p.setX(5); oder p.x=5; eine der Koordinaten zu verändern einen Fehler auslösen würde.
Hab auch kurz gegoogelt (nicht besonders lange, muss ich zugeben) und nichts derartiges gefunden.
Hast du da was zur Hand? (nicht lang suchen, falls nicht. Ist nicht so wichtig)

 

httpdigest

Top Contributor
const in C/C++ ist wirklich etwas ganz anderes als final in Java.
Bei einer Variablen/Parameter, die/der als const markiert ist, lassen sich über diese Variable navigiert auch keine Member indirekt mehr verändern.
Man muss auch nicht bis zu C++ gehen, C reicht auch schon aus:
C:
typedef struct _MyStruct {
    int a;
} MyStruct;

void function(const MyStruct s) {
    s.a = 3; // <- Fehler!
}
Zusätzlich gibt es dann in C ja auch noch const pointer of const type:
C:
void function(const MyStruct * const s) {
    MyStruct otherStruct = { 4 };
    s->a = 3; // Fehler wie oben
    s = &otherStruct; // <- auch Fehler
}
 

mihe7

Top Contributor
Womit wir wieder bei dem Punkt wären, den ich oben angesprochen hatte: in C/C++ kann ich via const-Keyword fallweise ein "Immutable" haben, in Java brauche ich dafür ein Interface.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
J Final Method Allgemeine Java-Themen 9
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
J private static final String variable Allgemeine Java-Themen 8
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
G Synchronization on non final field Allgemeine Java-Themen 10
Z Als Final deklarierte Klasse im Array sortieren Allgemeine Java-Themen 2
G Klasse als final -> Laufzeitverbesserung? Allgemeine Java-Themen 4
T Final Methode dennoch überschreiben! Allgemeine Java-Themen 10
W Innere Klasse und final Allgemeine Java-Themen 11
A Als FINAL deklarieren -> sinnvoll? Allgemeine Java-Themen 16
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
S Reflections und final Allgemeine Java-Themen 19
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
meez immutable final? Allgemeine Java-Themen 23
S Wave Soundausgabe Java 1.4.2 contra 1.5 Final Allgemeine Java-Themen 27
G final und Variablen Allgemeine Java-Themen 16
B Java 5.0 Final Allgemeine Java-Themen 3
M 1.5 final? Allgemeine Java-Themen 2
D JNA getFieldOrder() Bedeutung Allgemeine Java-Themen 6
M Bedeutung von [Ljava.lang.String;@6eb38a Allgemeine Java-Themen 7
G Parameter Bedeutung Allgemeine Java-Themen 4
P Bedeutung der Process.exitValue() Werte? Allgemeine Java-Themen 3
A Bedeutung des Prozentzeichens Allgemeine Java-Themen 3
C Bedeutung von \r Allgemeine Java-Themen 6
Z bedeutung (übersetzung) von null? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben