Предложения ассилий (все версии Java) и Питера Лоури (> = Java5) являются стандартным способом в этом случае.
Однако я хотел бы обратить ваше внимание на то, что предотвращение расширения статического служебного класса - это очень окончательное решение, которое может преследовать вас позже, когда вы обнаружите, что у вас есть связанные функции в другом проекте, и вы ' на самом деле я хочу расширить его.
Я предлагаю следующее:
public abstract MyClass {
protected MyClass() {
}
abstract void noInstancesPlease();
void myMethod() {
...
}
... // More private methods and fields...
}
Это идет против устоявшейся практики, поскольку позволяет расширять класс при необходимости, по-прежнему предотвращает случайное создание экземпляров (вы даже не можете создать анонимный экземпляр подкласса, не получив очень явной ошибки компилятора).
Всегда писает о том, что служебные классы JDK (например, java.util.Arrays) фактически были сделаны окончательными. Если вы хотите, чтобы у вас был собственный класс Arrays с методами для, скажем, сравнения, вы не можете, вы должны создать отдельный класс. Это распространит функциональность, которая (IMO) принадлежит друг другу, и должна быть доступна через один класс. Это оставляет вас либо с дико распределенными служебными методами, либо вам придется продублировать каждый из методов в вашем собственном классе.
Рекомендую никогда не делать такие служебные классы окончательными. На мой взгляд, преимущества не перевешивают недостатки.