Согласно жесткой интерпретации объектно-ориентированного проектирования, служебный класс - это то, чего следует избегать.
Проблема в том, что если вы следуете жесткой интерпретации, вам нужно будет заставить свой класс превратиться в какой-то объект для достижения многих целей.
Даже Java-дизайнеры создают служебные классы (на ум приходит java.lang.Math)
Ваши варианты:
double distance = Math.sqrt(x*x + y*y); //using static utility class
против
RootCalculator mySquareRooter = new SquareRootCalculator();
mySquareRooter.setValueToRoot(x*x + y*y);
double distance;
try{
distance = mySquareRooter.getRoot();
}
catch InvalidParameterException ......yadda yadda yadda.
Даже если бы мы избегали многословного метода, мы все равно могли бы получить:
Mathemetician myMathD00d = new Mathemetician()
double distance = myMathD00d.sqrt(...);
в этом случае .sqrt () по-прежнему статичен, так какой смысл в создании объекта?
Ответ таков: создавайте служебные классы, когда вы можете создать искусственный класс "Worker", который не имеет или почти не используется для переменных экземпляра.