3 Fragen rund um Klassenattribute

Carcharoth

Bekanntes Mitglied
Hallo

Ich habe 3 Fragen rund um Klassenattribute:
1) Welche Sichtbarkeit hat ein Klassenattribut wenn ich weder public, noch private oder protected schreibe? sollte man grundsätzlich immer die Sichtbarkeit definieren?
2) Innerhalb der Klasse, macht es einen Unterschied, wenn ich in einer Methode ein Klassenattribut direkt anspreche, über this.attribut oder sogar via Getter/Setter?
3) Macht es einen Unterschied Klassenattribute bei der Deklaration zu initialisieren, oder im Konstruktor?

Java:
public class Ding {
    int zaehler = 0;
    String name;
        
    Ding(String name) {
        this.name=name;
    }
}

Java:
public class Ding {
    int zaehler;
    String name;
        
    Ding(String name) {
        this.name=name;
        zaehler=0;
    }
}

Danke und Gruss
 
1) Welche Sichtbarkeit hat ein Klassenattribut wenn ich weder public, noch private oder protected schreibe? sollte man grundsätzlich immer die Sichtbarkeit definieren?
Default ist: package-private: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
Ob du das willst, oder nicht, hängt davon ab, ob du Klassen innerhalb desselben Packages auch Zugriff auf die Attribute erlauben willst.

2) Innerhalb der Klasse, macht es einen Unterschied, wenn ich in einer Methode ein Klassenattribut direkt anspreche, über this.attribut oder sogar via Getter/Setter?
Definiere "Unterschied". Meinst du Performance (= nein, kein Unterschied) oder meinst du eventuell Wartbarkeit der Anwendung (Zugriffe direkt auf Felder ausserhalb der "Schnittstelle" der Klasse sind immer böse, innerhalb der Klasse ist es in der Regel okay.)

3) Macht es einen Unterschied Klassenattribute bei der Deklaration zu initialisieren, oder im Konstruktor?
Nein. Der Compiler setzt die Initialisierung bei der Deklaration automatisch in den Konstruktor als erste Anweisung bei der Kompilierung.
 
OK alles klar.
Ich bin bisher damit gut zurecht gekommen aber wollte wissen, ob das eine oder das andere "saubere" Programmierpraxis war oder eben nicht.

Danke & Gruss
 
Zu den Anmerkungen von httpdigest noch eine weitere Bemerkung zu
2) Innerhalb der Klasse, macht es einen Unterschied, wenn ich in einer Methode ein Klassenattribut direkt anspreche, über this.attribut oder sogar via Getter/Setter?
Wenn du beispielsweise in der set-Methode Überprüfungen des übergebenen Wertes vornimmst (ist der Wert auch gültig), sparst du dir (verdoppelten) Code, wenn du im Konstruktor diese set-Methode aufrufst.
 
Wenn du beispielsweise in der set-Methode Überprüfungen des übergebenen Wertes vornimmst (ist der Wert auch gültig), sparst du dir (verdoppelten) Code, wenn du im Konstruktor diese set-Methode aufrufst.
Wobei man aufpassen sollte, wenn man im Konstruktor öffentliche Methoden der Klasse aufruft, diese könnten, sofern die Klasse das zulässt, in einer Unterklasse überschrieben werden und damit zu "unerwünschten Nebenwirkungen" führen.
 
wenn ich in einer Methode ein Klassenattribut direkt anspreche, über this.attribut
Das ist zwar möglich, sollte man aber nicht machen, denn eine Klassenvariable ist ja gerade kein Attribut der Instanz. Kurz: nicht this.attribut sondern Klasse.attribut verwenden. Analog gilt für Methoden, die sich auf Klassenvariablen beziehen, dass diese static sein und per Klasse.methode() angesprochen werden sollten.

Abgesehen davon gibt es mit Ausnahme von Konstanten kaum einen sinnvollen Einsatz für statische Attribute.
 
Das ist zwar möglich, sollte man aber nicht machen, denn eine Klassenvariable ist ja gerade kein Attribut der Instanz. Kurz: nicht this.attribut sondern Klasse.attribut verwenden. Analog gilt für Methoden, die sich auf Klassenvariablen beziehen, dass diese static sein und per Klasse.methode() angesprochen werden sollten.

Abgesehen davon gibt es mit Ausnahme von Konstanten kaum einen sinnvollen Einsatz für statische Attribute.
Hier muss man jetzt unterscheiden in Klassen-Attribut und Instanz-Attribut!

Ich glaube @Carcharoth meint eigentlich Instanz-Attribute, bzw. Instanzvariablen.
Java:
class Foo {
    static int klassenVariable;
    int instanzVariable;
}
 

Zurück
Oben