Является ли это «правильным» способом ведения дел или мы должны создавать экземпляр класса утилит, как и когда нам это нужно?
С точки зрения OOD это зависит: -)
Для чистых функций вы должны использовать статические методы в Java / C #. В C # вы также можете попытаться использовать методы расширения, как описывают другие.
Для служебных методов, которые не являются чистыми функциями (например, чтение некоторого файла), вы должны создать экземпляр для улучшения тестируемости (например, разрешить насмешку).
Разница в том, что последние, хотя и не сохраняют никакого состояния напрямую, они связываются с некоторыми внешними компонентами, имеющими собственное, возможно, изменяющееся состояние. Это внешнее состояние может привести к тому, что этот служебный метод будет возвращать разные результаты с течением времени (для одного и того же ввода), что усложнит его тестирование и рассуждение. Хорошим принципом разработки является различие между чистыми функциями и такими вспомогательными методами, если использовать последние как явные методы экземпляра.
Однако в практике Java «аргумент насмешливости» обычно имеет предшествующее значение, поскольку он не позволяет имитировать статические методы.