Когда сделать метод статическим?
Я хотел бы знать, как люди решают, следует ли определять метод как статический. Я знаю, что метод можно определить только как статический, если он не требует доступа к полям экземпляра. Итак, скажем, у нас есть метод, который не имеет доступа к полям экземпляра, всегда ли вы определяете такой метод, как статический, или только если вам нужно его статически ставить (без ссылки на экземпляр).
Возможно, другой способ задать тот же вопрос: используете ли вы статический или нестатический по умолчанию?
Ответы
Ответ 1
Я использую статические методы всякий раз, когда могу. Преимущества:
- При вызове статического метода из метода экземпляра вы можете быть уверены, что никаких побочных эффектов для состояния текущего объекта нет.
- Изнутри статического метода вы можете быть уверены, что случайно не изменяете какое-либо состояние экземпляра объекта.
- Вы можете использовать статический метод вне класса без создания экземпляра. Если бы можно было сделать метод статическим, ему явно не нужен экземпляр, поэтому нет необходимости требовать его.
- Статические методы могут быть немного более эффективными, потому что не нужно передавать указатель "this", и динамическая отправка не требуется.
Ответ 2
Кевин Бурриллион написал проницательный ответ по этой теме некоторое время назад (правда, с точки зрения Java, но я считаю, что это применимо и к другим языкам).
Он утверждает, что в основном только использовать статические методы для чистых функций.
A " чистая функция" - это любой метод, который не изменяет никакого состояния и чей результат зависит только от предоставленные ему параметры. Таким образом, для Например, любая функция, которая выполняет I/O (прямо или косвенно) не является чистая функция, но Math.sqrt(), of Конечно, есть.
Я склонен согласиться. (Хотя в моем собственном коде, традиционно, я, вероятно, использовал слишком много статических вспомогательных методов повсюду...: -P И это, безусловно, сделало код, который использует эти методы сложнее для тестирования.)
Ответ 3
Используйте статические методы при выполнении операций, которые не работают с экземплярами класса.
Прекрасным примером может быть метод sqrt
класса Math
.
Ответ 4
Если то, что метод действительно зависит только от его аргументов, вы можете сделать его статическим. Если метод не создает экземпляр каких-либо других ваших пользовательских классов, вы можете сделать его статическим. Однако по умолчанию это будет нестатический.
Ответ 5
Это зависит. В языках, где возможны функции, отличные от членов, я бы сказал, что большую часть времени, если метод может быть сделан статическим, вместо него вместо него следует использовать функцию, отличную от члена, а не как друга. Вы можете сказать, что у меня есть основной фон на С++.
В "чистых" OO-языках, где функции, не являющиеся членами, невозможны, это будет зависеть от того, является ли метод "случайным" статическим (т.е. просто не нужен доступ к членам экземпляра) или действительно логически статичен - это метод всего класса, а не для конкретного экземпляра.
Ответ 6
Нестационарный по умолчанию, статический, когда мне нужна функциональность, доступная по меньшей мере из двух разных классов, и я не хочу тратить конструктор.
пс. Правила Архимеда!
Ответ 7
(С#) По умолчанию я использую статические методы в статических классах и нестатические методы в нестатических классах.
Когда я разрабатываю класс, я нахожусь естественным образом сходящимся, делая его полностью статическим или полностью нестатичным. Практически, если я начну хотеть определять статические члены в нестационарном классе, я часто обнаруживаю, что в конечном итоге он будет иметь смысл разбить их на отдельный статический класс - либо такой класс утилиты, как Math или глобальное приложение класса (например,.NET ConfigurationManager).
С объектно-ориентированной точки зрения метод делает что-то с/с объектом. Поэтому, если вы используете экземпляр объекта, для меня наиболее разумно думать об объектных методах как о нестатических. Технически вы технически можете сделать нестатический класс статическими членами, если они не требуют доступа к экземпляру. Но якобы, по крайней мере, методы класса все равно будут делать что-то с этим классом, поэтому я все равно сделаю их нестатичными. Все вещи равны, то есть.