Utils... (inaczej helper) - czyli coś gdzie wrzucasz wszystko co nie pasuje do żadnej twojej klasy...
Założenie jest takie, że musisz zrobić jakąś metodę, ale nie ma żadnej klasy która reprezentowała by strukturę, gdzie taka metoda by pasowała... albo potrzebujesz zrobić metodę do klasy finalnej, więc nierozszerzalnej, lub coś w tym rodzaju. W związku z tym klasa ta nie ma obiektów. Powinieneś tą klasę oznaczyć jako final, tak, aby nikt nie mógł jej rozszerzać oraz zrobić prywatny konstruktor bez parametrów. Dzięki temu stworzenie instancji tej klasy nie będzie możliwe.
Teraz wady i zalety takiego rozwiązania. Zaletą jest na pewno łatwy dostęp do takich metod. Są to, a przynajmniej powinny, publiczne metody statyczne, a więc wystarczy odnieść się do klasy i wywołać statyczną metodę. Wad natomiast znalazłbym kilka. Po pierwsze globalność - takiej metody nie da się nadpisać i zmienić jej zachowania - czyli jednej z najważniejszych zalet programowania obiektowego. W najlepszej sytuacji powinna być klasa, która będzie coś reprezentować, którą można rozszerzyć i nadpisać metody, by zmienić ich zachowanie. Po drugie trudność debugowania. Metoda ta jest globalna, dostępna zewsząd. Debugowanie takiej metody w poszukiwaniu zmian jest znacznie bardziej utrudnione.
Czyli podsumowując takie utils to metody, które nie pasują do żadnej klasy, którą masz, więc wrzucasz je do jednego worka, aka "utils"/"helper". Metody w tej klasie zawarte powinny być publiczne i statyczne, co niesie za sobą łatwość dostępu, ale za to trudność debugowania i niezmienność (brak możliwości zmiany ich zachowania).
Jeszcze inną kwestią jest, tutaj nie poruszona, przechowywanie modyfikowalnych (mutable) danych globalnie, czyli w polach statycznych.
Pozdrawiam Czerwono