Это все вопрос контекста. Некоторые люди уже приводили примеры, когда статичность абсолютно предпочтительна, например, при написании служебных функций без мыслимого состояния. Например, если вы пишете коллекцию различных алгоритмов сортировки, которые будут использоваться в массивах, создание вашего метода, кроме статического, только запутывает ситуацию. Любой программист, читающий ваш код, должен был бы спросить, почему вы НЕ сделали его статичным, и должен был бы посмотреть, делаете ли вы что-то с состоянием объекта.
public class Sorting {
public static void quiksort(int [] array) {}
public static void heapsort(int[] array) { }
}
Сказав это, многие люди пишут какой-то код и настаивают на том, что у них есть какой-то особый одноразовый код, но позже выясняется, что это не так. Например, вы хотите рассчитать статистику по переменной. Итак, вы пишете:
public class Stats {
public static void printStats(float[] data) { }
}
Первый элемент плохого дизайна здесь заключается в том, что программист намеревается просто распечатать результаты, а не использовать их в общем. Внедрение ввода / вывода в вычисления ужасно для повторного использования. Однако следующая проблема заключается в том, что эта универсальная процедура должна вычислять max, min, среднее, дисперсию и т. Д. И хранить ее где-нибудь. Куда? В состоянии объекта. Если бы это было действительно одноразово, вы могли бы сделать его статичным, но, конечно, вы обнаружите, что хотите вычислить среднее значение двух разных вещей, и тогда будет очень приятно, если вы сможете просто создать экземпляр объекта несколько раз .
public class Stats {
private double min,max,mean,var;
public void compute(float data[]) { ... }
public double getMin() { return min; }
public double
}
Реакция коленного рефлекса против статики часто является реакцией программистов на глупость делать подобные вещи статически, поскольку проще просто сказать никогда не делать этого, чем на самом деле объяснить, какие случаи в порядке, а какие - глупые.
Обратите внимание, что в этом случае я на самом деле использую объект как своего рода специализированный проход по ссылке, потому что Java в этом отношении очень неприятен. В C ++ такого рода вещи могли бы быть функциями с любым состоянием, передаваемым как ссылки. Но даже в C ++ применяются те же правила, просто Java заставляет нас больше использовать объекты из-за отсутствия передачи по ссылке.
Что касается производительности, то наибольший прирост производительности при переключении с обычного метода на самом деле заключается в том, чтобы избежать динамической полиморфной проверки, которая по умолчанию используется в java и которая в C ++ указывается вручную с помощью virtual.
Когда я пытался использовать last, было преимущество 3: 1 в вызове метода final перед обычным методом, но при вызове статических функций перед final не было заметно.
Обратите внимание, что если вы вызываете один метод из другого, JIT часто достаточно умен, чтобы встроить код, и в этом случае вообще нет вызова, поэтому делать какие-либо заявления о том, сколько именно вы экономите, чрезвычайно опасно. Все, что вы можете сказать, это то, что когда компилятор должен вызывать функцию, он не может повредить, если он может вызывать функцию типа static или final, которая требует меньше вычислений.