Нет ничего плохого в статических классах, которые действительно статичны . То есть не существует внутреннего состояния, о котором можно было бы говорить, что привело бы к изменению вывода методов.
Если Dice.roll()
просто возвращается новое случайное число от 1 до 6, это не меняет состояние. Конечно, вы можете делиться Random
экземпляром, но я бы не подумал, что изменение состояния, как по определению, вывод всегда будет хорошим, случайным. Это также потокобезопасный, поэтому здесь нет проблем.
Вы часто будете видеть финальные "вспомогательные" или другие служебные классы, которые имеют приватный конструктор и статические члены. Закрытый конструктор не содержит логики и служит только для предотвращения создания экземпляра класса. Последний модификатор лишь возвращает идею, что это не тот класс, из которого вы бы хотели получить. Это просто служебный класс. Если все сделано правильно, не должно быть ни одного сингла или других учеников, которые сами не являются статичными и окончательными.
Пока вы следуете этим правилам и не делаете одиночные игры, в этом нет абсолютно ничего плохого. Вы упоминаете класс контроллера, и это почти наверняка потребует изменения состояния, поэтому я бы не советовал использовать только статические методы. Вы можете сильно полагаться на статический служебный класс, но вы не можете сделать его статическим служебным классом.
Что считается изменением состояния для класса? Что ж, давайте исключим случайные числа на секунду, так как они по определению недетерминированы и, следовательно, возвращаемое значение часто меняется.
Чистая функция - это функция, которая является детерминированной, то есть для данного входа вы получите один и ровно один выход. Вы хотите, чтобы статические методы были чистыми функциями. В Java есть способы настройки поведения статических методов для хранения состояния, но они почти никогда не являются хорошими идеями. Когда вы объявляете метод как статический , типичный программист сразу же предполагает, что это чистая функция. Отклонение от ожидаемого поведения - это то, как вы склонны создавать ошибки в вашей программе, и вообще этого следует избегать.
Синглтон - это класс, содержащий статические методы, которые настолько противоположны «чистой функции», насколько это возможно. Один статический закрытый член хранится внутри класса, который используется для обеспечения того, чтобы был только один экземпляр. Это не лучшая практика и может привести к неприятностям позже по ряду причин. Чтобы понять, о чем мы говорим, вот простой пример синглтона:
// 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"