Классы с только статическими функциями-членами часто представляют собой классы полезности, т. Е. Они обеспечивают группировку для функций, которые работают с другими связанными объектами. Например, существует класс Files
, который предоставляет функции для работы с объектами File
и apache commons ArrayUtils
, который предоставляет инструменты для работы с T[]
.
Единственный разумный случай, который я видел для расширения класса утилит, заключается в уменьшении связи с сторонними классами утилиты. (Что, на мой взгляд, является относительно слабой причиной).
Скажет, у вас есть третья партия Foo
утилиты, которые вы используете
public class YourFooUtilities {
public static void makeAFooSing(Foo f) {...}
}
Но вы также должны иметь некоторые внутренние Foo
утилит, то вы можете сделать это:
public class MyFooUtilities extends YourFooUtilities {
public static void makeAFooDance(Foo f) { ... }
public static void makeAFooDanceAndSing(Foo f) {
makeAFooDance(f);
makeAFooSing(f);
}
}
Тогда ваше использование YourFooUtilities
всегда может быть через MyFooUtilites
, давая слой абстракции
static import MyFooUtilities.*;
public static class MainClass {
void doSomething() {
Foo f = new Foo();
makeFooDance(f);
makeFooSing(f);
makeAFooDanceAndSing(f);
}
}
Это делает ваш код (слегка) менее жестко привязан к стороннему коду.
Конечно, в зависимости от ваших потребностей –
Я не вижу, какая разница будет – JGerulskis
@JGerulskis Существует, так как статические методы нельзя переопределить в способе использования методов экземпляра. – hexafraction