Ответ 1
Что касается области bean, если bean не имеет какого-либо состояния (т.е. класс не имеет каких-либо изменяемых переменных экземпляра), то он может быть безопасным для приложений. См. Также Как правильно выбрать область bean? Все это независимо от цели bean (утилита или нет). Учитывая, что служебные функции имеют одно определение без учета состояния, тогда вы определенно должны использовать область приложения bean. Это экономит затраты на создание экземпляра при каждом отдельном запросе.
Что касается наличия методов утилиты в управляемом bean, в объектно-ориентированной перспективе это плохая практика, потому что для доступа к ним из EL эти методы не могут быть static
, пока они должны быть. Вы не можете использовать их в качестве реальных методов утилиты в других нормальных классах Java. Анализаторы статического кода, такие как Sonar, отметят их всем большим красным флагом. Это, таким образом, анти-шаблон. Правильный подход состоял бы в том, чтобы использовать настоящий класс утилиты (public final class
с private Constructor()
только с методами static
) и регистрировать все эти методы static
как функции EL в your.taglib.xml
, как описано в Как создать пользовательскую функцию EL для вызова статического метода?
По крайней мере, это то, что вы должны делать, когда собираетесь использовать общедоступную библиотеку, например JSTL fn:xxx()
, PrimeFaces p:xxx()
или OmniFaces of:xxx()
. Если вы используете OmniFaces, вы могли бы вместо создания файла your.taglib.xml
ссылаться на класс в <o:importFunctions>
. Он автоматически экспортирует все методы public static
данного типа в область функций EL.
<o:importFunctions type="com.example.Utils" var="u" />
...
<x:foo attr="#{u:foo(bean.property)}" />
Если вы не используете OmniFaces, и все это для внутреннего использования, то я могу представить, что становится утомительным повторять все, что your.taglib.xml
шаблон регистрации для каждой крошечной функции полезности, которая внезапно появляется. Я могу рационализировать и простить злоупотребление приложением bean для таких случаев "только для внутреннего использования". Только когда вы начинаете экстернализировать/модулировать/публиковать его, тогда вы должны действительно зарегистрировать их как функции EL, а не публиковать публичные плохие практики.