Полезные методы в области применения bean

Считаете ли вы, что рекомендуется использовать все широко используемые методы использования в области приложений bean?

В текущей реализации приложения, над которым я работаю, все утилиты (манипулирование строками, куки, проверка URL-адреса, проверка текущей страницы, где пользователь и т.д.) все помещены в один большой запрос с областью bean и они ссылаются на каждую страницу xhtml.

Я не мог найти никакой информации о stackoverflow, если бы подход ввода методов утилиты в область приложения bean был бы хорошим или плохим выбором.

Почему я столкнулся с этой идеей - необходимость повторного использования этих методов в bean более широкой области, чем область с запросом bean (например, просмотр или сеанс с ограниченной привязкой bean). Исправьте меня, если я ошибаюсь, но вы всегда должны вводить те же или более широкие области охвата beans, то есть вы не должны вводить область охвата запроса bean внутри области с видимым охватом.

Я думаю, что использование полезных методов из области приложения bean должно быть полезным (новых образов объектов не будет, один объект будет создан и повторно использован во всех приложениях), но все же я хотел бы получить подтверждение или кто-то скажет мне, если это неправильный подход и почему это неправильно.

Ответ 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, а не публиковать публичные плохие практики.