Statische Methoden und Attribute

Aus Programmieren-Wiki
🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 3 annotiert und ab Blatt 4 abgezogen wird. 🤓

Beschreibung

Wir haben zuvor in Hilfsklassen und Konstanten schon das Keyword "static" gesehen. Aber was macht das überhaupt? Wann ist was Statisch und wie verhält es sich?

Statische Methoden

Statische Methoden werden nicht auf einem Objekt, sondern auf einer klasse aufgerufen. Entsprechend haben sie auch keinen zugriff auf die Instanzattribute ihrere Klasse. Sie sollten also dann verwendet werden, wenn die Funktionalität der Methode nicht von dem Zustand des Objektes abhängt.

Ein typischer Anwendungsfall dieser Regel sind Hilfsklassen (Utility Klassen). Für private Methoden reicht es im Allgemeinen sie nur dann als statisch zu deklarieren, wenn sie von anderen statischen Methoden aufgerufen werden sollen.

Statische Attribute

Statische Attribute sind Werte, die in der Klasse und nicht einem Objekt gespeichert werden. Dadurch greifen alle Objekte dieser Klasse auf den gleichen Wert zu. Das führt meißt zu schwer lesbarem Code, da Objekte auf eine nicht offensichtliche Art miteinander interagieren. Deshalb sollten statische Attribute grundsätzlich vermieden werden. Eine wichtige Ausnahme sind Konstanten. Wie dort schon vorgestellt, sollen sie immer als static final deklariert werden. Static, damit alle Klasseninstanzen denselben Wert besitzen und final, damit dieser Wert nicht durch die Objekte verändert werden können.


Negativbeispiel

public class Receipt {  
    private static idCounter = 0;  
   
    private final int id;  
    private final List<Product> products;  
   
    public Receipt(List<Product> products) {  
        this.id = idCounter++;    // Hier interagieren alle Objekte vom Typ Receipt miteinander und ändern den globalen Zustand von idCounter  
        this.products = products;  
    }  
   
    private static double getTotalPrice(List<Product> products) {    // getTotalPrice hängt eigentlich vom Zustand des Receipt ab  
        double total = 0;  
   
        for (Product product : products) {  
            total += product .getPrice();  
        }  
   
        return total;  
    }  
}

Positivbeispiel

public class Receipt {  
    private final int id;  
    private final List<Product> products;  
   
    public Receipt(int id, List<Product> products) {  
        this.id = id;    // Der idCounter wird an anderer Stelle gespeichert, z.B. in der Klasse die Receipts erzeugt und speichert  
        this.products = products;  
    }  
   
    private double getTotalPrice() {  
        double total = 0;  
   
        for (Product product : this.products) {  
            total += product .getPrice();  
        }  
   
        return total;  
    }  
}