Non c'è niente di sbagliato nelle classi statiche che sono veramente statiche . Vale a dire, non esiste uno stato interno di cui parlare che provocherebbe la modifica dell'output dei metodi.
Se Dice.roll()
sta semplicemente restituendo un nuovo numero casuale da 1 a 6, non sta cambiando stato. Certo, potresti condividere Random
un'istanza, ma non riterrei che un cambio di stato come per definizione, l'output sarà sempre a posto, casuale. È anche thread-safe quindi non ci sono problemi qui.
Vedrai spesso "Helper" finali o altre classi di utilità che hanno un costruttore privato e membri statici. Il costruttore privato non contiene alcuna logica e serve solo a impedire a qualcuno di creare un'istanza della classe. Il modificatore finale porta solo a casa questa idea che questa non è una classe da cui vorresti mai derivare. È semplicemente una classe di utilità. Se fatto correttamente, non dovrebbero esserci singoli membri della classe o altri membri che non siano essi stessi statici e finali.
Fintanto che segui queste linee guida e non crei singoli, non c'è assolutamente nulla di sbagliato in questo. Lei menziona una classe di controller, e questo richiederà quasi certamente cambiamenti di stato, quindi sconsiglio di usare solo metodi statici. Puoi fare molto affidamento su una classe di utilità statica, ma non puoi renderla una classe di utilità statica.
Cosa viene considerato un cambio di stato per una classe? Bene, lasciamo escludere numeri casuali per un secondo, poiché non sono deterministici per definizione e quindi il valore restituito cambia spesso.
Una funzione pura è deterministica, vale a dire, per un dato input, otterrai uno e esattamente un output. Volete che i metodi statici siano pure funzioni. In Java ci sono modi di modificare il comportamento dei metodi statici per mantenere lo stato, ma non sono quasi mai buone idee. Quando dichiarate un metodo come statico , il programmatore tipico assumerà subito che è una funzione pura. Deviare dal comportamento previsto è il modo in cui si tende a creare bug nel programma, in generale e dovrebbe essere evitato.
Un singleton è una classe che contiene metodi statici all'opposto della "funzione pura" come puoi essere. Un singolo membro privato statico viene mantenuto internamente alla classe utilizzata per garantire che esista esattamente un'istanza. Questa non è la migliore pratica e può metterti nei guai in seguito per una serie di motivi. Per sapere di cosa stiamo parlando, ecco un semplice esempio di 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"