Pokud je to opravdu triviální utilita, která určitě nebude záviset na ničem dalším (např. často testujete, zda řetězec není prázdný, tj. zda není null nebo nemá délku 0 – tak si ty dvě podmínky složíte do jedné metody), dělá se to opravdu tak, že vytvoříte finální třídu se statickými metodami, vytvoříte v ní privátní bezparametrický konstruktor, který vyhazuje výjimku (takže instance nepůjde vytvořit ani děděním nebo reflexí).
Často ale ten kód bude složitější, bude záviset na dalším kódu (nebo to tak může být v budoucnosti). Pak se ta implementace píše jako klasická třída, od které se pak v aplikaci vytvoří jediná instance – singleton. Tahle třída pak může záviset na jiných třídách – a díky tomu, že to jsou instance (které předáváte typicky v konstruktoru, nebo alespoň pomocí setterů), můžete pak implementaci snadno vyměnit, aniž byste musel zasahovat do kódu. Což se hodí třeba v případě testů. Nejspíš brzy dojdete k tomu, že takovýchhle tříd budete mít víc a budou mít různě propletené závislosti – pak se vám hodí nějaký IoC framework, který ty instance bude vytvářet za vás a bude řešit ty závislosti. A obvykle vám pak umožní jenom změnou konfigurace určit, která implementace se má použít.
Jinak to, že máte služby, které dělají jenom nějaké transformace s datama, je naprosto běžná věc. Funguje takhle nejspíš drtivá většina evidenčních aplikací (e-shopy, účetnictví, sklady atd.). Proto také vzniká tolik frameworků, které takovou architekturu programů podporují – ORM, IoC apod. Je to návrat k procedurálnímu programování. V C máte datové struktury a procedury/funkce, které s daty manipulují. Dnes se sice programuje s objekty, ale ve skutečnosti tam často máte zase jen datové entity nebo přepravky, tedy datové struktury, které nemají žádný výkonný kód, a vedle nich služby, které s těmi daty manipulují (ale nemají žádný stav) a které se typicky dělají jako bezstavový singleton.