Non c'è niente di sbagliato nelle classi statiche che sono veramente statiche . Vale a dire, non esiste uno stato interno di cui parlare che possa far cambiare l'output dei metodi.
Se Dice.roll()
sta semplicemente restituendo un nuovo numero casuale da 1 a 6, non sta cambiando stato. Certo, potresti condividere un'istanza Random
, ma non considererei un cambiamento di stato come per definizione, l'output sarà sempre buono, casuale. È anche thread-safe quindi non ci sono problemi qui.
Vedrai spesso "Helper" finale o altre classi di utilità che hanno un costruttore privato e membri statici. Il costruttore privato non ha alcuna logica e serve solo per impedire a qualcuno di creare un'istanza della classe. Il modificatore finale porta a casa questa idea che questa non è una classe da cui vorresti mai provenire. È semplicemente una classe di utilità. Se fatto correttamente, non ci dovrebbero essere singoli o membri della classe che non siano essi stessi statici e definitivi.
Finché seguirai queste linee guida e non farai singleton, non c'è assolutamente nulla di sbagliato in questo. Lei menziona una classe di controller, e questo quasi certamente richiede 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.
Che cosa è considerato un cambiamento di stato per una classe? Bene, escludiamo i numeri casuali per un secondo, poiché sono non deterministici per definizione e quindi il valore di ritorno cambia spesso.
Una funzione pura è una deterministica, vale a dire, per un determinato input, si otterrà uno ed esattamente un output. Vuoi che i metodi statici siano funzioni pure. In Java ci sono modi per modificare il comportamento dei metodi statici per mantenere lo stato, ma non sono quasi mai delle buone idee. Quando dichiari un metodo come statico , il tipico programmatore assumerà subito il fatto che si tratta di una funzione pura. Deviando dal comportamento previsto è come si tende a creare bug nel programma, in generale, e dovrebbe essere evitato.
Un singleton è una classe che contiene metodi statici come opposti alla "pura funzione" che puoi essere. Un singolo membro statico privato viene mantenuto internamente alla classe che viene 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 un 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"