Я також здивований кількістю статичних методів у грі, але чому б і ні, якщо він працює нормально ...
Насправді я не згоден з вашим учителем.
Якщо об'єкт не має стану (тобто глобальних змінних), а містить лише методи для прикладу, це не дає вам ніяких переваг використання об'єкта, аніж статичних методів. За винятком того, якщо ви плануєте додати стан пізніше (стан, який не слід надавати спільний доступ), або якщо ви використовуєте інтерфейс і хочете мати можливість легкого переключення реалізації, простіше використовувати статичні методи ...
Сам JDK, apache commons або багато фреймворків включають статичні методи:
- StringUtils
- Pattern.matches (регулярний вираз, введення)
----------
Насправді, я думаю, вам цікаво, що з класами, такими як JPA.java:
https://github.com/playframework/play/blob/master/framework/src/play/db/jpa/JPA.java
Вони використовують лише статичні методи і зберігають статичний стан. Це може бути дивним, але насправді для мене це трохи схоже на використання синглтона, за винятком того, що методи використовуються в статичному контексті замість об'єкта. Головна відмінність полягає в тому, що вам не потрібно викликати getInstance () щоразу.
Я думаю, це було розроблено так для зручності використання, оскільки не зручно викликати "getInstance", і це здорово, коли ви можете легко отримати сеанс скрізь (пов'язаний з потоком), замість того, щоб вводити sessionFactory скрізь за допомогою xml або автоматичного підключення. ..
Можливо, ваш професор радить вам уникати використання статики, оскільки це може бути небезпечним для вашого дизайну, якщо ви неправильно їх використовуєте. Але зауважте, що у багатьох випадках заміна статичних методів єдиним не покращує ваш дизайн. Навіть якщо ви зараз викликаєте методи методу екземпляра, об'єкти все одно будуть тісно пов'язані ...
Тож, можливо, правилом повинно бути уникати використання статики, за винятком випадків, коли ви насправді не піклуєтесь про щільне зчеплення.
У цьому випадку, коли ви викликаєте методи JPA.xxx (), ваш код тісно пов'язаний з класом JPA фреймворка. Але я не думаю, що гра розроблена таким чином, щоб ви могли легко переходити з одного фреймворку без будь-якої переробки ...
Це велика різниця зі специфікацією EJB3 або подібними речами: якщо методи менеджера сутності EJB3 є статичними, ви будете змушені щільно з'єднати свій код із реалізацією, зателефонувавши HibernateEntityManager.xxx () або ToplinkEntityManager.xxx (). У цьому випадку існує загальний інтерфейс (і ми не можемо додавати статичні методи до інтерфейсів).
----------
- Цей клас не є частиною специфікації, яка використовується для інших фреймворків.
- Клас JPA має лише одну реалізацію: таку, яку виконує гра. І вони, ймовірно, не планують робити другий.
- Таким чином, тісна зв'язок із цим класом Play, поки ви використовуєте фреймворк Play, здається мені нормальною.