Nie ma nic złego w klasach statycznych, które są naprawdę statyczne . Innymi słowy, nie istnieje żaden stan wewnętrzny, który mógłby zmienić dane wyjściowe metod.
Jeśli Dice.roll()
po prostu zwraca nowy losowy numer od 1 do 6, to nie zmienia stanu. To prawda, że współdzielisz Random
instancję, ale nie uważam, że zmiana stanu z definicji zawsze będzie dobra, losowa. Jest również bezpieczny dla wątków, więc nie ma tu żadnych problemów.
Często zobaczysz ostatecznego „Pomocnika” lub inne klasy narzędzi, które mają prywatnego konstruktora i członków statycznych. Prywatny konstruktor nie zawiera logiki i służy jedynie do zapobiegania tworzeniu instancji klasy przez kogoś. Ostatni modyfikator sprowadza ten pomysł do domu, że nie jest to klasa, z której nigdy nie chciałbyś czerpać. To tylko klasa użyteczności. Jeśli zostanie to wykonane poprawnie, nie powinno być singletonów ani innych członków klasy, którzy sami nie są statyczni i ostateczni.
Dopóki postępujesz zgodnie z tymi wytycznymi i nie tworzysz singli, nie ma w tym absolutnie nic złego. Wspominasz o klasie kontrolera, a to prawie na pewno będzie wymagało zmian stanu, więc odradzam stosowanie tylko metod statycznych. Możesz w dużej mierze polegać na statycznej klasie narzędzi, ale nie możesz uczynić go statyczną klasą narzędzi.
Co uważa się za zmianę stanu klasy? Cóż, wykluczmy liczby losowe na sekundę, ponieważ z definicji nie są deterministyczne, a zatem wartość zwracana często się zmienia.
Czysta funkcja to taka, która jest deterministyczna, co oznacza, że dla danego wejścia otrzymasz jeden i dokładnie jeden wynik. Chcesz, aby metody statyczne były czystymi funkcjami. W Javie istnieją sposoby poprawiania zachowania metod statycznych w celu utrzymania stanu, ale prawie nigdy nie są to dobre pomysły. Kiedy zadeklarujesz metodę jako statyczną , typowy programista natychmiast przyjmie, że jest to czysta funkcja. Odbiegając od oczekiwanego zachowania, ogólnie rzecz biorąc, masz tendencję do tworzenia błędów w swoim programie i należy tego unikać.
Singleton jest klasą zawierającą metody statyczne, które są jak najbardziej przeciwne „czystej funkcji”. Pojedynczy statyczny element prywatny jest przechowywany wewnętrznie w klasie, która służy do zapewnienia, że istnieje dokładnie jedna instancja. To nie jest najlepsza praktyka i może sprawić kłopoty później z wielu powodów. Aby dowiedzieć się, o czym mówimy, oto prosty przykład singletona:
// 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"