Недавно я начал программировать в Groovy для инфраструктуры тестирования интеграции, для проекта Java. Я использую Intellij IDEA с плагином Groovy и с удивлением вижу в качестве предупреждения все методы, которые не являются статичными и не зависят от каких-либо полей экземпляра. В Java, однако, это не проблема (по крайней мере, с точки зрения IDE).
Должны ли все методы, которые не зависят ни от каких полей экземпляров, быть преобразованы в статические функции? Если это правда, это специфично для Groovy или доступно для ООП вообще? И почему?
Ответы:
Обратите внимание, что IDEA имеет эту проверку и для Java, она называется Method может быть «статической» ,
Дело в том, что для кода Java эта проверка по умолчанию отключена (программист может включить ее по своему усмотрению). Причина этого, скорее всего, заключается в том, что обоснованность / полезность такой проверки может быть оспорена на основе нескольких достаточно авторитетных источников.
Начнем с того, что официальное руководство по Java довольно ограничено, когда методы должны быть статичными:
С учетом вышеизложенного можно утверждать, что включение по умолчанию упомянутой проверки не соответствует рекомендованному использованию статического модификатора в Java.
Кроме того, есть пара других источников, которые даже предлагают разумный подход к использованию идей, которые лежат в основе этой проверки, или даже препятствуют ей.
Смотрите, например , Java World статьи - г - н Счастливый Объект учит статические методы :
В статье в блоге Google для тестирования даже говорится о том, что статические методы - это смерть для тестирования :
Видите ли, приведенное выше выглядит вполне естественно, что упомянутая проверка отключена по умолчанию для Java.
Разработчикам IDE было бы очень трудно объяснить, почему они считают, что это так важно, чтобы установить его по умолчанию, вопреки широко признанным рекомендациям и лучшим практикам.
Для Groovy все совсем иначе. Ни один из приведенных выше аргументов не применим, в частности, тот, что касается тестируемости, как объяснено, например, в статье Mocking Static Methods в статье Groovy в Javalobby:
Это различие, вероятно, почему настройка по умолчанию для упомянутой проверки противоположна в Groovy. В то время как в Java по умолчанию «on» будет источником путаницы для пользователей, в Groovy противоположная настройка может сбить пользователей с IDE.
«Эй, метод не использует поля экземпляра, почему вы не предупредили меня об этом?» На этот вопрос было бы легко ответить для Java (как описано выше), но для Groovy просто нет убедительных объяснений.
источник
Трудно представить, что это окажет какое-либо заметное влияние на производительность. Единственное преимущество, которое я вижу в их создании,
static
заключается в том, что он обеспечивает визуальную индикацию того, что состояние экземпляра не изменяется. Другими словами, он говорит человеку, читающему исходный код, что-то ... «интересное» об этом методе, просто благодаря тому, что он там есть. Реальный вопрос, это проясняет или смущает? «Почему этот метод статический? Это фабричный метод? Нужна ли возможность вызывать его без экземпляра объекта?»Кроме того, некоторым людям не нравятся статические методы, потому что они утверждают, что вы не можете их издеваться, и поэтому они не тестируемы или что-то в этом роде. Конечно, если вы делаете его статичным по любой из обычных причин, таких как, например, предоставление заводского метода, тогда я полностью за это. Я просто не совсем уверен, что создание статических методов только потому, что они не затрагивают состояние экземпляра, является мандатом.
источник
final
или специально разработаны с учетом наследования.Я думаю , что это для того, чтобы возможный рефакторинга быть замечен .
После того, как метод сделан статическим, становится ясно, что он может быть перемещен из класса, скажем, в класс единицы.
Также легко преобразовать его в метод экземпляра одного из его параметров, часто это именно то место, где должен быть код.
источник
Обратите внимание, что у вас могут быть классы без состояния, которые реализуют некоторый интерфейс (например,
java.lang.Runnable
вы не можете сделать их методы статичными. Некоторые шаблоны (например, Стратегия) также могут создавать объекты без состояния, которые могут даже иметь несколько методов).Статики являются двоюродными братьями синглетонов. В дальнейшем будет очень трудно перейти от статики к нестатике - поэтому, когда вам нужно будет добавить состояние, у вас возникнет желание начать вводить статические переменные.
источник