Немає нічого поганого в статичних класах, які є справді статичними . Тобто немає внутрішнього стану, про який можна було б говорити, що могло б призвести до зміни результатів методів.
Якщо Dice.roll()
просто повертається нове випадкове число від 1 до 6, стан не змінюється. Зрозуміло, ви можете ділитися Random
екземпляром, але я б не вважав, що зміна стану, як за визначенням, вихід завжди буде добре, випадково. Він також захищений від потоку, тому тут проблем немає.
Ви часто побачите остаточний "Helper" або інші класи утиліти, які мають приватний конструктор та статичні члени. Приватний конструктор не містить логіки і служить лише для того, щоб хтось не міг інстанціювати клас. Остаточний модифікатор лише приносить цю ідею додому, що це не клас, з якого ви хотіли б походити. Це просто корисний клас. Якщо все зроблено належним чином, не повинно бути одиночних чи інших членів класу, які самі по собі не є статичними та остаточними.
Поки ви дотримуєтесь цих вказівок і не робите одинаків, в цьому немає нічого поганого. Ви згадуєте клас контролера, і це майже напевно вимагатиме змін стану, тому я б радив не використовувати лише статичні методи. Ви можете сильно покластися на статичний клас корисності, але не можете зробити його статичним класом корисності.
Що вважається зміною стану для класу? Ну, давайте виключаємо випадкові числа на секунду, оскільки вони недетерміновані за визначенням, і тому повернене значення часто змінюється.
Чиста функція - це детермінована, тобто для даного введення, ви отримаєте один і точно один вихід. Ви хочете, щоб статичні методи були чистими функціями. У 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"