Подтвердить что ты не робот

Когда сделать метод статическим?

Я хотел бы знать, как люди решают, следует ли определять метод как статический. Я знаю, что метод можно определить только как статический, если он не требует доступа к полям экземпляра. Итак, скажем, у нас есть метод, который не имеет доступа к полям экземпляра, всегда ли вы определяете такой метод, как статический, или только если вам нужно его статически ставить (без ссылки на экземпляр).

Возможно, другой способ задать тот же вопрос: используете ли вы статический или нестатический по умолчанию?

4b9b3361

Ответ 1

Я использую статические методы всякий раз, когда могу. Преимущества:

  • При вызове статического метода из метода экземпляра вы можете быть уверены, что никаких побочных эффектов для состояния текущего объекта нет.
  • Изнутри статического метода вы можете быть уверены, что случайно не изменяете какое-либо состояние экземпляра объекта.
  • Вы можете использовать статический метод вне класса без создания экземпляра. Если бы можно было сделать метод статическим, ему явно не нужен экземпляр, поэтому нет необходимости требовать его.
  • Статические методы могут быть немного более эффективными, потому что не нужно передавать указатель "this", и динамическая отправка не требуется.

Ответ 2

Кевин Бурриллион написал проницательный ответ по этой теме некоторое время назад (правда, с точки зрения Java, но я считаю, что это применимо и к другим языкам).

Он утверждает, что в основном только использовать статические методы для чистых функций.

A " чистая функция" - это любой метод, который не изменяет никакого состояния и чей результат зависит только от предоставленные ему параметры. Таким образом, для Например, любая функция, которая выполняет I/O (прямо или косвенно) не является чистая функция, но Math.sqrt(), of Конечно, есть.

Я склонен согласиться. (Хотя в моем собственном коде, традиционно, я, вероятно, использовал слишком много статических вспомогательных методов повсюду...: -P И это, безусловно, сделало код, который использует эти методы сложнее для тестирования.)

Ответ 3

Используйте статические методы при выполнении операций, которые не работают с экземплярами класса.

Прекрасным примером может быть метод sqrt класса Math.

Ответ 4

Если то, что метод действительно зависит только от его аргументов, вы можете сделать его статическим. Если метод не создает экземпляр каких-либо других ваших пользовательских классов, вы можете сделать его статическим. Однако по умолчанию это будет нестатический.

Ответ 5

Это зависит. В языках, где возможны функции, отличные от членов, я бы сказал, что большую часть времени, если метод может быть сделан статическим, вместо него вместо него следует использовать функцию, отличную от члена, а не как друга. Вы можете сказать, что у меня есть основной фон на С++.

В "чистых" OO-языках, где функции, не являющиеся членами, невозможны, это будет зависеть от того, является ли метод "случайным" статическим (т.е. просто не нужен доступ к членам экземпляра) или действительно логически статичен - это метод всего класса, а не для конкретного экземпляра.

Ответ 6

Нестационарный по умолчанию, статический, когда мне нужна функциональность, доступная по меньшей мере из двух разных классов, и я не хочу тратить конструктор.

пс. Правила Архимеда!

Ответ 7

(С#) По умолчанию я использую статические методы в статических классах и нестатические методы в нестатических классах.

Когда я разрабатываю класс, я нахожусь естественным образом сходящимся, делая его полностью статическим или полностью нестатичным. Практически, если я начну хотеть определять статические члены в нестационарном классе, я часто обнаруживаю, что в конечном итоге он будет иметь смысл разбить их на отдельный статический класс - либо такой класс утилиты, как Math или глобальное приложение класса (например,.NET ConfigurationManager).

С объектно-ориентированной точки зрения метод делает что-то с/с объектом. Поэтому, если вы используете экземпляр объекта, для меня наиболее разумно думать об объектных методах как о нестатических. Технически вы технически можете сделать нестатический класс статическими членами, если они не требуют доступа к экземпляру. Но якобы, по крайней мере, методы класса все равно будут делать что-то с этим классом, поэтому я все равно сделаю их нестатичными. Все вещи равны, то есть.