An statischen Klassen, die wirklich statisch sind, ist nichts auszusetzen . Das heißt, es gibt keinen internen Zustand, von dem die Ausgabe der Methoden sich ändern würde.
Wenn Dice.roll()
einfach eine neue Zufallszahl von 1 bis 6 zurückgegeben wird, ändert sich der Status nicht. Zugegeben, Sie teilen möglicherweise eine Random
Instanz, aber ich würde nicht in Betracht ziehen, dass bei einer Statusänderung per Definition die Ausgabe immer gut und zufällig sein wird. Es ist auch threadsicher, so dass es hier keine Probleme gibt.
Es werden häufig endgültige "Helper" - oder andere Dienstprogrammklassen angezeigt, die einen privaten Konstruktor und statische Member haben. Der private Konstruktor enthält keine Logik und dient nur dazu, zu verhindern, dass jemand die Klasse instanziiert. Der letzte Modifikator bringt nur die Idee auf den Punkt, dass dies keine Klasse ist, von der Sie jemals abgeleitet werden möchten. Es ist nur eine Gebrauchsklasse. Bei ordnungsgemäßer Ausführung sollten keine Singleton- oder anderen Klassenmitglieder vorhanden sein, die selbst nicht statisch und endgültig sind.
Solange Sie diesen Richtlinien folgen und keine Singletons machen, ist daran absolut nichts auszusetzen. Sie erwähnen eine Controller-Klasse, und dies erfordert mit ziemlicher Sicherheit Statusänderungen. Ich rate daher davon ab, nur statische Methoden zu verwenden. Sie können sich stark auf eine statische Dienstprogrammklasse verlassen, sie jedoch nicht zu einer statischen Dienstprogrammklasse machen.
Was ist eine Zustandsänderung für eine Klasse? Lassen Sie uns Zufallszahlen für eine Sekunde ausschließen, da sie per Definition nicht deterministisch sind und sich daher der Rückgabewert häufig ändert.
Eine reine Funktion ist eine deterministische, dh für eine bestimmte Eingabe erhalten Sie genau eine Ausgabe. Sie möchten, dass statische Methoden reine Funktionen sind. In Java gibt es Möglichkeiten, das Verhalten statischer Methoden zu optimieren, um den Status zu halten, aber es sind fast nie gute Ideen. Wenn Sie eine Methode als statisch deklarieren , geht der typische Programmierer von vornherein davon aus, dass es sich um eine reine Funktion handelt. Abweichend vom erwarteten Verhalten neigen Sie generell dazu, Fehler in Ihrem Programm zu verursachen und sollten vermieden werden.
Ein Singleton ist eine Klasse, die statische Methoden enthält, die der "reinen Funktion" so entgegengesetzt sind, wie Sie nur können. Ein einzelnes statisches privates Mitglied wird intern in der Klasse gespeichert, um sicherzustellen, dass genau eine Instanz vorhanden ist. Dies ist keine bewährte Methode und kann Sie aus verschiedenen Gründen später in Schwierigkeiten bringen. Um zu wissen, wovon wir sprechen, hier ein einfaches Beispiel für einen Singleton:
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"