No hay nada malo con las clases estáticas que son verdaderamente estáticas . Es decir, no hay un estado interno del que hablar que pueda causar cambios en la salida de los métodos.
Si Dice.roll()
simplemente devuelve un nuevo número aleatorio del 1 al 6, no está cambiando de estado. De acuerdo, es posible que esté compartiendo una Random
instancia, pero no consideraría que un cambio de estado ya que, por definición, la salida siempre será buena, aleatoria. También es seguro para subprocesos, por lo que no hay problemas aquí.
A menudo verá "Ayudante" final u otras clases de utilidad que tienen un constructor privado y miembros estáticos. El constructor privado no contiene lógica y solo sirve para evitar que alguien cree una instancia de la clase. El modificador final solo trae esta idea a casa de que esta no es una clase de la que quieras derivarte. Es simplemente una clase de utilidad. Si se hace correctamente, no debe haber un miembro único u otros miembros de la clase que no sean estáticos y finales.
Mientras sigas estas pautas y no estés haciendo singletons, no hay absolutamente nada de malo en esto. Menciona una clase de controlador, y esto seguramente requerirá cambios de estado, por lo que aconsejaría no usar solo métodos estáticos. Puede confiar en gran medida en una clase de utilidad estática, pero no puede convertirla en una clase de utilidad estática.
¿Qué se considera un cambio de estado para una clase? Bueno, excluyamos números aleatorios por un segundo, ya que no son deterministas por definición y, por lo tanto, el valor de retorno cambia a menudo.
Una función pura es aquella que es determinista, es decir, para una entrada dada, obtendrá una y exactamente una salida. Desea que los métodos estáticos sean funciones puras. En Java hay formas de ajustar el comportamiento de los métodos estáticos para mantener el estado, pero casi nunca son buenas ideas. Cuando declaras un método como estático , el programador típico asumirá de inmediato que es una función pura. Desviarse del comportamiento esperado es cómo tiende a crear errores en su programa, en general, y debe evitarse.
Un singleton es una clase que contiene métodos estáticos tan opuestos a la "función pura" como puede ser. Un único miembro privado estático se mantiene internamente en la clase que se utiliza para garantizar que haya exactamente una instancia. Esta no es la mejor práctica y puede meterte en problemas más adelante por varias razones. Para saber de qué estamos hablando, aquí hay un ejemplo simple de 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"